的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()
答案 0 :(得分:5)
他们被覆盖得很好。
但是你已经从基础构造函数调用了它们,并且当基本构造函数执行时,对象的派生部分还不存在。
所以这是一个很大程度上的安全功能,它是C ++标准规定的。
答案 1 :(得分:5)
因为您在构造函数中调用虚方法。在构造Base类时,派生的一个(SubClass)仍然没有构造,所以实际上它还不存在。
避免在构造函数中调用虚方法通常是一种很好的做法。