【问题标题】:C++ Class Inheritance and assignment operatorC++ 类继承和赋值运算符
【发布时间】:2013-06-18 04:28:45
【问题描述】:

我来这里是想问一些我自己无法解决的问题。我一直在编写一个存储 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&);
}

到目前为止,如果我声明类 Binary_Class 的 3 个对象 abc,然后是 set_decab,则声明 c=a+b可以用(?)

但是,我想通过使用新类来扩展类二进制文件

class Binary_Class_Extended: public Binary_Class
{
  // weird functions
}

如果我声明了Binary_Class_Extended类的3个对象abc,我还能像之前一样使用c=a+b吗?

在 Netbean 中,它说没有 operator= 与我的 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*)) 中的 'operator=' 不匹配(Binary_Class*)(&sb)))))'

Binary_ET_Class sa,sb,sc;

sc=sa+sb //初始化sasb为非空值;

我一直在研究的完整源代码:https://pastebin.com/eiVz0f5p

【问题讨论】:

  • 请使用正确的大小写。
  • 啊,感谢您更正帖子。抱歉,当时我的注意力并不集中在这上面。

标签: c++ class inheritance binary operator-keyword


【解决方案1】:

继承的函数会保留他们的指纹,所以如果继承了 Binary_Class operator+,它的返回值将是...?

【讨论】:

  • 啊,多么简单的答案。我想我对待那些所谓的操作员的方式有所不同。它们只是功能对吗?所以,如果我想保留 operator+ 的功能,我应该在新类中写一个,不是吗?
  • 是的——我想到了另一件事;您的 operator+ 不是 const,它可能应该是 -- operator "+" 用于x = a + b,但它用于 a 和 b,而不是 x。所以你可能想要const Binary_Class& operator+(const Binary_Class& src) const;。见courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html。您的 Binary_Class_Extended 可以通过将其定义为 const Binary_Class_Extended& operator+(const Binary_Class& rhs) const; 并允许它采用基类而不是派生类来用一块石头杀死两只鸟。
  • 哦,我也看到了分页并阅读了它,但错过了括号后面的最后一个 const。这是当所有都是 Binary_Class_Extended 时的错误,我没有在该类上重新声明 = 和 + 运算符,也就是我在问题中提到的 operator= 错误:main.cpp:285: error: no match for 'operator=' in 'sd = ((Binary_Class*)(&sa))->Binary_Class::operator+(((const Binary_Class&)((const Binary_Class*)((Binary_Class*)(&sb)))))'
  • 你能把它和更新的代码一起附加到原始帖子中,以便我更容易看到吗?
  • pastebin.com/eiVz0f5p 我把完整的源代码贴在这里,如果你不介意的话,希望你可以尝试阅读我乱七八糟的代码。我马上更新帖子
【解决方案2】:

一般来说,继承和赋值(“值语义”)在 C++ 中不容易混合。在第二种情况下,“a+b”将返回基类的实例,除非您为派生类定义分隔符 operator+。然后将结果仅分配给“c”的基类部分,这会触发错误。这有时也称为切片/截断。注意操作符的选择是在编译时,没有调用虚函数,所以静态类型要匹配。

不要混合使用值类型和多态类型。如果您确实需要并且您有一个固定且已知的层次结构,则可以在分配给基类时使用“Handle-Body Idiom”来保留派生信息。不过,这不是初学者的话题。

【讨论】:

  • 哦,所以他们不把接线员给孩子?我认为新类“继承”了基类的所有优点,如果我不重新定义运算符+,那么函数保持不变,只需将类从Binary_Class 更改为Binary_Class_Extended。新类的目的是通过为其提供附加功能来扩展基类的功能,但我认为我未能实现这一点,因为原始功能(如 operator+)丢失(无法在新类上执行) .
猜你喜欢
  • 2021-06-07
  • 2020-12-15
  • 2012-02-28
  • 2015-02-09
  • 2012-02-12
  • 2021-08-28
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多