Коллекция указателей на разные объекты с полиморфизмом - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть виртуальный базовый класс B и производные классы D1 и D2. У меня есть виртуальный метод в B, и я переопределил этот метод в D1 и D2. Теперь я хочу иметь список, содержащий указатели на объекты из D1 и D2. Естественно, я объявляю этот указатель как B *. Позвольте мне заранее сказать, что любое копирование объектов из класса B и его производных классов запрещено. Я хочу иметь эффекты полиморфизма в этом списке. Один метод, который я видел, состоит в том, чтобы иметь виртуальный метод «клонирования» в B и переопределить этот метод в D1 и D2, чтобы он возвращал указатели на D1 и D2. Но я не могу сделать это, потому что все копирование запрещено (и мой конструктор копирования удален)

class B {
  protected:
   double payment;
  public:
   virtual void getPayment() const = 0;
   virtual B* copy() const = 0;
   B(const B&) = delete;
   B& operator=(const B&) = delete;
};

class D1: public B {
 public:
  double getPayment() const override { return payment*2;}
  D1* copy() { return new D1(*this); } // This wont work because copying is prohibited
};

class D2: public B {
 public:
  double getPayment() const override { return payment*4;}
  D2* copy() { return new D2(*this); } // This wont work because copying is prohibited
};

int main() {

struct Elem {
  B* b;
  Elem* next = nullptr;
  Elem(const B& b1): b(b1.copy()) {}; // This wont work because copying is prohibited
  ~Elem() {delete b;}
};
}

Есть ли другой способ сделать это? Одна вещь, которую я придумал, - это всегда проверять, является ли объект типом D1 или D2, а затем динамически преобразовывать указатель, но это кажется совершенно противоположным тому, что должен делать полиморфизм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...