Виртуальных конструкторов в C++ не существует, потому что конструкторы служат принципиально другой цели, чем виртуальные функции.
Виртуальные функции работают благодаря делегированию вызовов методов реализациям в производных классах во время выполнения. Однако конструкторы отвечают за инициализацию конкретного экземпляра класса, что требует знания точного типа на этапе компиляции.
Когда ты вызываешь new MyClass(), компилятор должен:
Этот процесс нельзя делегировать другому объекту, потому что объект ещё не существует — делегировать попросту некому. Виртуальные функции требуют существующего экземпляра объекта с указателем на виртуальную таблицу, а конструктор на это опираться не может.
Хотя настоящих виртуальных конструкторов не существует, похожую функциональность можно получить с помощью паттерна clone или фабричных методов:
class Base {
public:
virtual Base* clone() = 0;
virtual ~Base() {}
};
class Derived : public Base {
public:
Derived* clone() override {
return new Derived(*this);
}
};
Виртуальные конструкторы не могут существовать в C++, потому что конструкторы должны знать точный тип во время компиляции, чтобы выделить память и инициализировать переменные-члены для конкретного экземпляра класса.
Новый — ещё не проверен сообществом
Вы