我来这里问一些我自己无法解决的问题。我一直在编码一个小类,该类存储32位数组,并且可以执行简单的数学运算,例如+,-,/和*。
假设我有一个类似的课程:
class Binary_Class
{
char bin[32]; // 32 bits array to hold an unsigned binary number
void set_dec(int value){}; // setting the bin[32] value based on input value
// I have operator + and = to perform on objects of this class.
Binary_Class& operator= (const Binary_Class&);
const Binary_Class operator+ (const Binary_Class&);
}
[直到现在,如果我声明3个a
类的对象b
,c
,Binary_Class
,然后从set_dec
至a
和b
,就不会出现问题,语句c=a+b
可以被使用(?)
但是,我想通过使用新类来扩展类二进制文件
class Binary_Class_Extended: public Binary_Class
{
// weird functions
}
如果我声明类a
的3个对象b
,c
,Binary_Class_Extended
,在此之前我仍然可以像以前一样使用c=a+b
吗?
在Netbean中,如果所有的都是c=a+b
,则没有匹配我的Binary_Class_Extended
的运算符,但是如果我将c
声明为Binary_Class
,则该语句有效。这意味着a+b
返回const Binary_Class
,就好像operator+
没有被带到新类中。
我是想念东西还是这样吗?
当然,我可以发布整个代码,因为这只是一个任务,但我认为这些信息目前就足够了。
更新
class Binary_Class
{
char bin[32]; // 32 bits array to hold an unsigned binary number
void set_dec(int value){}; // setting the bin[32] value based on input value
//i have operator + and = to perform on objects of this class.
Binary_Class& operator= (const Binary_Class&);
const Binary_Class operator+ (const Binary_Class&) const;
}
class Binary_Class_Extended: public Binary_Class
{
// weird functions
}
[当我尝试显示Binary_Class_Extended
的所有对象时,显示此错误:
main.cpp:285:错误:'sd =((Binary_Class *)(&sa))-> Binary_Class :: operator +(((const Binary_Class&)((const Binary_Class *)(( Binary_Class *)(&sb)))))')'
Binary_ET_Class sa,sb,sc;
sc=sa+sb
//将sa
和sb
初始化为非空值;
我一直在研究的完整源代码:https://pastebin.com/eiVz0f5p
继承的函数保留其指纹,因此如果Binary_Class运算符+被继承,则其返回值为...?
通常,继承和赋值(“值语义”)在C ++中不容易混合。在第二种情况下,“ a + b”将返回基类的实例,除非您为派生类定义了一个分隔符operator +。然后仅将结果分配给触发错误的“ c”的基类部分。有时也称为切片/截断。请注意,运算符的选择在编译时进行,没有调用任何虚函数,因此静态类型必须匹配。
不要混合值类型和多态类型。如果确实需要并且您有固定的已知层次结构,则可以在分配给基类时使用“句柄惯用法”保留派生信息。不过,这不是一个初学者的话题。