为什么无法从派生类对象访问父类的赋值运算符

时间:2012-04-09 00:24:44

标签: c++ inheritance assignment-operator

示例:

class C
{
  public:
    void operator =(int i) {}
};

class SubC : public C
{
};

以下是编译错误:

SubC subC;
subC = 0;

“'subC = 0'''''''''''''''''''''''''

有些消息来源说这是因为赋值运算符不是继承的。但这不仅仅是因为SubC的默认构造副本分配遮盖了它们吗?

4 个答案:

答案 0 :(得分:11)

在派生类中自动生成复制赋值运算符。由于C ++的常规名称隐藏规则,这会导致基类的赋值运算符被隐藏。您可以通过“using”指令取消隐藏基类中的名称。例如:

class C
{
  public:
    void operator =(int i) {}
};

class SubC : public C
{
  public:
    using C::operator=;
};

答案 1 :(得分:2)

基类的复制赋值运算符没有派生类的复制赋值运算符所需的签名。它由派生类继承,但不构成其中的复制赋值运算符。因此,即使赋值运算符是继承的,就像其他成员函数一样,它也不提供复制赋值。

答案 2 :(得分:1)

我还没有完成它,但根据The Man Himself(Stroustrup)它是构造函数的C ++ 11的一个特性,但它自C以来一直存在++ 98用其他方法来做。

这是从链接中直接解除的:

  

人们有时会对普通范围规则的事实感到困惑   适用于班级成员。特别是,基类的成员不是   在与派生类成员相同的范围内:

struct B {
    void f(double);
};

struct D : B {
    void f(int);
};

B b;   b.f(4.5);  // fine
D d;   d.f(4.5);  // surprise: calls f(int) with argument 4
     

在C ++ 98中,我们可以提升"基础上的一组重载函数   class成派生类:

struct B {
    void f(double);
};

struct D : B {
    using B::f;     // bring all f()s from B into scope
    void f(int);    // add a new f()
};

B b;   b.f(4.5);  // fine
D d;   d.f(4.5);  // fine: calls D::f(double) which is B::f(double)

所以你去吧。如果你想要的话,你很可能会把它带走#34;甚至在C ++ 11之前,虽然我自己没有尝试过。

答案 3 :(得分:0)

除了复制赋值运算符,可以继承其他重载运算符。

我同意SubC的默认构造副本分配遮盖C的重载赋值运算符。

如果SubC不提供复制赋值运算符,编译器将合成复制赋值操作, 如下:

class SubC : public C
{ 
public:
    SubC & operator=( const SubC & other );
}

然后是'SubC& operator =(const SubC& other)'覆盖C的赋值运算符, 导致编译错误。

如果

SubC other;
SubC subC;

subC = other;

然后,这个案例,编译确定。