c++ - C++ 中 operator= 的奇怪行为

标签 c++ inheritance assignment-operator

我有一个基类 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"),导致编译器错误。

    最佳答案

    您的 B::operator=不是复制赋值运算符。除了您提供的,还有一个隐式定义的复制赋值运算符,它等效于

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

    此运算符不打印任何内容,但它调用基类上的赋值,并且打印 A= .
    b1 = b2调用此复制赋值运算符。 b1 = c电话B::operator=(A&)C不是 B .

    如果您希望您的运算符被调用,请使用上面显示的签名定义一个复制赋值运算符,而不是其他重载,或者除了其他重载之外。

    关于c++ - C++ 中 operator= 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61292016/

    相关文章:

    c++ - 导致编译错误的意外模板实例化

    c++ - 函数和方法的放置和使用

    c++ - lambda 的速度与内联函数

    javascript - 这是 JavaScript 原型(prototype)继承模型中的缺陷吗?

    r - 为 `<<-` 定义时 `x < y <- z` 的歧义

    c++ - QPainterPath 形状 union (单笔划)

    c++ - 基类函数不调用派生类函数

    java - Java 中静态抽象方法的替代方案

    c++ - 对数组使用算术

    Javascript:如何将另一个对象 B 的方法混合到我的对象 A 中而不进行复制但进行链接?