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谢谢。