C ++中operator =的奇怪行为

nuppigeller:

我有一个基类A和两个派生类B和C。B定义=运算符,将基类A作为参数。

在类B上调用=时,有时会调用基类A的运算符,而不是B中的运算符。

class A {
        public:

        void operator=(A &) {
                printf("A =\n");
        };
};

class B : public A {

        public:

        void operator=(A &s) {
                printf("B =\n");
        };
};

class C : public A {
};

int main()
{
        B b1, b2;
        C c;

        b1 = b2;
        b1 = c;
}

输出为:

A =
B =
  • 为什么第一个分配不调用B :: operator =()?

  • 为什么第二个赋值也不也调用A :: operator =(),因为它也是从A派生的?

  • 我该怎么做才能使B :: operator =()每次都被调用?

看到这个,我感到非常惊讶。我注意到它只是因为我在A类中删除了operator =()(“ operator =()= delete”),导致编译器错误。

伊戈尔·坦德尼克(Igor Tandetnik):

B::operator=不是副本分配操作员。除了您提供的一个,还有一个隐式定义的复制分配运算符,它等效于

B& operator=(const B& other) {
  A::operator=(other);
  return *this;
}

此运算符不输出任何内容,但会在基类上调用该赋值,然后执行print A=

b1 = b2调用此副本分配运算符。b1 = c来电B::operator=(A&)以来C,不是B

如果要调用运算符,请使用上面显示的签名定义一个复制分配运算符,以代替其他重载或在其他重载之外进行定义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章