2012-01-15 78 views
0

我难以理解这样的:除了赋值运算符,C++中的哪些运算符不会被继承?

众所周知的是赋值运算符不会直接继承了......我已经问过这个昨天LINK

AFAIK以下非虚拟运营商不会继承,以及:

operator& //unary user defined 
operator* //unary user defined 

所有其他运营商将被继承(纠正我,如果我错了)

哪个虚拟运营商不会被继承? (虚拟说明符有什么区别?)

+5

所有成员函数都是继承的,不管它们是否为运算符重载。 'operator ='的特殊之处在于,无论是隐式声明还是用户声明,它都将被派生类实现隐藏。如果你有其他理解,我想你可能误解了关联问题的答案。 – 2012-01-15 14:39:55

+0

请注意,大多数二元运算符('+',''''''',''''''''')应该是自由函数,而不是方法,因为这将允许无法进行的转换。 – 2012-01-15 14:46:09

+0

谢谢Charles和Anton! – codekiddy 2012-01-15 15:09:20

回答

4

严格地说,一切都是遗传的。然而,以下将通过隐含声明的形式隐藏在派生类(或用户声明的版本中,如果用户声明他们):

  • 默认构造方法:T()
  • 析构函数:~T()
  • 复制构造:T(T const &)(有时没有const
  • 拷贝赋值运算符:T & operator=(T const &)(有时没有const
  • 移动构造函数:T(T &&)
  • 布展赋值运算符:T & operator=(T &&)

operator&operator*继承和其他事物一样。 virtual声明没有区别。

+0

谢谢。如果我明白:隐藏的意志也将是:assigment operator,move assigment,move copy ctor。那是对的吗? – codekiddy 2012-01-15 15:01:51

+0

@codekiddy:是的,当你评论时我只是添加它们(我的C++ 11知识有点粗略,所以我必须仔细查看它)。 – 2012-01-15 15:09:24

0

虚拟关键字应用于方法时,意味着子类可以选择是否覆盖它们。如果他们不这样做,超类的行为将在子类上调用该方法时执行。

如果虚拟方法是纯粹的,那么需要子类来覆盖它。没有默认行为,他们可以依靠。

+0

“通过超类指针或引用*在子类” - *上调用该方法时“。 – 2012-01-15 14:42:26

4

分配运算符由Derived类继承,但派生运算符的派生类版本hides基类版本。

所有其他操作员的情况也是如此。

+0

那么如果规则很简单,那就OK:D谢谢! – codekiddy 2012-01-15 15:08:45

0

我已阅读书在C++的思考,在第14章下面的行中提到

除了赋值运算符,运营商自动 继承到派生类。