C++ 中 operator= 的奇怪行为

Strange behaviour of operator= in C++

我有一个基数 class A 和两个派生的 classes B 和 C。B 定义了 = 运算符,以基数 class A 作为参数。

在 class B 上调用 = 时,有时会调用基础 class 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 =

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

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

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

此运算符不打印任何内容,但它调用基数 class 上的赋值,而那个运算符打印 A=.

b1 = b2 调用此复制赋值运算符。 b1 = c 调用 B::operator=(A&) 因为 C 不是 B.

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