Полиморфный оператор присваивания из базового и производного класса - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы иметь возможность копировать производный или базовый объект в производный объект, и я хотел бы, чтобы правильный оператор выбирался полиморфно в зависимости от типа копируемого объекта.

Этокод не работает, я бы хотел b1 = (A&)b2; использовать B & operator= (B const &other), потому что b2 это B, но он использует B & operator= (A const &other):

#include<iostream> 

using namespace std;

class A {
public:
    A & operator= (A const &other) {
        // Here copy A members...
        cout<<"A to A"<<endl;
        return *this;
    }
};

class B: public A {
public: 
    B & operator= (A const &other) {
        A::operator=(other); // Copy A members.
        cout<<"A to B"<<endl;
        return *this;
    }
    B & operator= (B const &other) {
        A::operator=(other); // Copy A members.
        // Here copy B members...
        cout<<"B to B"<<endl; 
        return *this;
    }
};

int main() 
{
    B b1, b2;
    A a2;
    b1 = b2;
    cout<<endl; 
    b1 = (A&)b2;
    cout<<endl; 
    b1 = a2;
    cout<<endl; 
    return 0; 
}

Я думаю, мне нужно что-то сделать virtual но я не могу найти как.

1 Ответ

0 голосов
/ 17 октября 2018

Я хотел бы иметь возможность скопировать производный или базовый объект в производный объект, Это признак плохого дизайна.

Лучше стремиться к дизайнугде только классы конечного уровня в иерархии классов являются инстанцируемыми.Это позволяет вам иметь чистые, не virtual, функции оператора присваивания, имеющие дело только с объектами правильного типа.

class A {
   public:

      // Make A uninstantiable.
      virtual ~A() = 0;

      A & operator= (A const &other) {
         // Here copy A members...
         cout<<"A to A"<<endl;
         return *this;
      }
};

class B: public A {
   public: 

      // Not necessary.
      // B & operator= (A const &other) { ... }

      B & operator= (B const &other) {
         A::operator=(other); // Copy A members.
         // Here copy B members...
         cout<<"B to B"<<endl; 
         return *this;
      }
};
...