When and why are superclass operator overloads hidden in a subclass?
我知道,如果子类提供了一个运算符方法(比如赋值),除非您明确地执行using superclass::operator=,否则它将在超类中隐藏该运算符,但是在我的代码中,我已经看到了需要执行此操作的情况即使子类根本不实现任何运算符。
是否存在具体的清单,其中隐藏了运算符(如果是一般情况,还有其他方法)而不会隐藏?
- 隐藏对于所有事物都是相同且系统地起作用的。您能(用代码)给出一个具体示例来说明您的意思吗?
-
另外:如果涉及到operator=:所有类都具有operator=;如果您不编写,则由编译器提供。
-
除非是= delete。
-
@Walter:删除的函数仍然参与查找,因此,要删除的函数是类"不具有"还是类"确实具有"但您实际上不能调用,这是一个有争议的问题。就查找而言,James是正确的,所有类都有一个operator=。
-
这个问题专门与赋值有关,即使子类未定义赋值运算符,我也看到超类operator=隐藏了。似乎编译器生成的版本隐藏了超类,因此我需要在每个子类中执行using super::operator=。
相关:麻烦C中的operator =继承。
operator=是编译器生成的唯一成员函数(构造函数和析构函数除外),因此,即使未在派生类中进行用户声明,也唯一隐藏的函数。
- 是的,但是它将在派生类中定义,因此他不需要using。
-
@JamesKanze:不需要using可以做什么?我以为他的意思是他需要using才能取消隐藏基类operator=。除了复制/移动以外,可能还有其他过载。
-
@JamesKanze我的猜测是他们期望在base::operator=中有一些输出。
-
@SteveJessop啊,是的。我不知道为什么我没想到。 (出于某种原因,我专注于派生类中的内容。)
-
@sftrabbit如果他们自己没有定义任何operator=,他们将如何处理。编译器生成的operator=调用基类operator=。
-
@sftrabbit很抱歉,但这不是编译器生成的derived::operator=应该隐藏但调用base::operator=的讨论的结果。那么"取消隐藏"的意义是什么,即使用base::operator=而不是derived::operator=呢?
-
@Walter:假设有一个base::operator=(int),并且派生类也希望将其应用于派生类。在C 11 operator=(const MyClass &&)中,在某些条件下没有编译器生成的operator=(int),只有operator=(const MyClass&)。