У меня есть виртуальный базовый класс 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, а затем динамически преобразовывать указатель, но это кажется совершенно противоположным тому, что должен делать полиморфизм.