首页 > 解决方案 > 为什么我的虚拟赋值运算符没有按预期执行?

问题描述

    class Base{
       public:
       virtual Base& operator=( const Base& ) {
          std::cout << "Base::operator=( const Base& )" << std::endl;
          return *this;
       }
    };

    class Derived: public Base{
       public:
       virtual Derived& operator=( const Base& ) {
          std::cout << "Derived::operator=( const Base& )" << std::endl;
          return *this;
       }
       virtual Derived& operator=( const Derived& ) {
          std::cout << "Derived::operator=( const Derived& )" << std::endl;
          return *this;
       }
    };

    int main(){
        Derived obj1, obj2;
        Base& ba=obj2;
        obj1=ba;//outputs[1]: Derived::operator=( const Base&)

        Derived& de=obj2;
        obj1=de;//outputs[2]: Derived::operator=( const Derived& )

        Base& bb=obj2;
        bb=obj1; //outputs[3]: Derived::operator=( const Base&)
     }

我对案例 3 输出感到困惑,不应该赋值运算符将正确的操作数作为函数参数,以便将obj1作为参数,并且由于obj1是 Derived 的类类型,因此它将调用Derived::operator=( const Derived&) ?

对于输出[3],为什么输出是Derived::operator=( const Base& ),而不是Derived::operator=( const Derived& )

标签: c++polymorphismvirtual-functionsassignment-operator

解决方案


Base 类中Derived::operator=( const Derived& )没有覆盖候选者。我建议override在每个旨在覆盖基类行为的方法之后添加关键字。它没有任何成本,并且可以使您的代码更安全。

如果要Derived::operator=( const Derived& )被调用,则需要在基类中提供正确的方法签名:

class Derived; // forward declaration

class Base{
       public:
       virtual Base& operator=( const Base& ) {
          std::cout << "Base::operator=( const Base& )" << std::endl;
          return *this;
       }

       virtual Base& operator=( const Derived& ) {
          std::cout << "Base::operator=( const Derived& )" << std::endl;
          return *this;
       }
    };

class Derived: public Base{
    public:
    virtual Derived& operator=( const Base& ) override {
      std::cout << "Derived::operator=( const Base& )" << std::endl;
      return *this;
    }
    virtual Derived& operator=( const Derived& ) override {
      std::cout << "Derived::operator=( const Derived& )" << std::endl;
      return *this;
    }
};

推荐阅读