C++ C++;:运算符=带多态性的重载

C++ C++;:运算符=带多态性的重载,c++,C++,我有以下代码: class Base { public: virtual Base& operator=(const Base& b); }; class Derived : public Base { virtual Derived& operator=(const Derived& d); }; int main() { Derived d1; Derived d2; Base *b1 = &d1;

我有以下代码:

class Base {
public:
    virtual Base& operator=(const Base& b);
};

class Derived : public Base {
    virtual Derived& operator=(const Derived& d);
};

int main() {
    Derived d1;
    Derived d2;
    Base *b1 = &d1;
    Base *b2 = &d2;

    *b1 = *b2; // <--
}
类基{
公众:
虚拟基和运算符=(常量基和b);
};
派生类:公共基{
虚拟派生和运算符=(常量派生和d);
};
int main(){
衍生d1;
衍生d2;
基数*b1=&d1;
基*b2=&d2;

*b1=*b2;//正确答案应归于@imreal的注释(函数具有不同的原型)

更改此项:

virtual Derived& operator=(const Derived& d)
为此:

virtual Base& operator=(const Base& b)

当然,您可以在每个类中以不同的方式实现此函数…

这里的问题是,在派生类中,您没有重新定义虚拟(运算符)函数,因为它具有不同的签名。因此,在
派生类中,您将得到两个重载运算符:

virtual Base& operator=(const Base& b); // inherited from Base
virtual Derived& operator=(const Derived& d); // defined in Derived

因为*b2的静态类型是Base。它们没有相同的签名。@OHT-请原谅我的无知…你怎么知道
Derived::operator=
没有被调用?@jww:无知已被原谅。打印到控制台或断点可以轻松完成这项工作…编辑后:编译器“推迟到运行时”只有在看到多个具有相同原型的
virtual
函数时,才决定执行哪个函数。在您的例子中,只有一个函数接受
Base
引用并返回
Base
引用,因此编译器可以“当场”作出决定。当然,但现在它不是一个非常有用的赋值运算符。@OliCharlesworth:取决于您在派生类中如何实现它。谢谢@barak。我不知道您和OHT在一起共享粘贴;)@jww:不客气:)顺便问一句,“共享粘贴”是什么意思?@barak-啊,我的错…在异地共享代码。粘贴箱,不是粘贴。(我认为皮包是女人用来保存胸罩的)。没有两个匹配;静态类型的<代码> *B1<代码>是代码> BASE< /COD>,所以编译器甚至不考虑在<代码>中派生的函数< /代码>。@ OliCharlesworth谢谢。