Возможный дубликат:
Вызов виртуальных функций внутри конструкторов
main.cpp
#include <iostream>
class BaseClass {
public:
BaseClass() {
init();
}
virtual ~BaseClass() {
deinit();
}
virtual void init() {
std::cout << "BaseClass::init()\n";
}
virtual void deinit() {
std::cout << "BaseClass::deinit()\n";
}
};
class SubClass : public BaseClass {
public:
virtual void init() {
std::cout << "SubClass::init()\n";
}
virtual void deinit() {
std::cout << "SubClass::deinit()\n";
}
};
int main() {
SubClass* cls = new SubClass;
delete cls;
return 0;
}
Почему init()
а также deinit()
неправильно переопределены и методы BaseClasses вызываются вместо методов SubClasses? Каковы требования, чтобы это работало?
BaseClass::init()
BaseClass::deinit()
Потому что вы вызываете виртуальный метод внутри конструктора. При создании базового класса производный класс (SubClass) еще не создан, поэтому фактически он еще не существует.
Обычно рекомендуется избегать вызова виртуальных методов внутри конструкторов.
Они отменены просто отлично.
Но вы вызвали их из базовый конструктор, и когда базовый конструктор выполняется, полученный часть объекта еще не существует.
Так что это в значительной степени функция безопасности, и это предусмотрено стандартом C ++.