Item 9: Never call virtual functions during construction or destruction
/*
* @Brief: Effective c++ item 9
* @Author: liudy
* @Email: deyin.liu@nscc-gz.cn
* @Date: 2021-06-24 22:40:43
* @LastEditors: liudy
* @LastEditTime: 2021-06-24 22:54:10
*/
#include <iostream>
using namespace std;
class A{
public:
A() {
cout << "construct A" << endl;
Logger();
}
~A() {
cout << "destory A " << endl;
Logger();
}
void print() {
Logger();
}
virtual void Logger() {
cout << "A logger" << endl;
}
};
class B : public A {
public:
B() {
cout << "construct B" << endl;
}
~B() {
cout << "destory B" << endl;
}
void Logger() {
cout << "B logger" << endl;
}
};
int main() {
B b;
b.print();
return 0;
}
输出为
construct A
A logger
construct B
B logger
destory B
destory A
A logger
在父类的构造函数和析构函数中调用虚函数,并不会动态的调用子类中的对该虚函数的实现。如上例子中,在A的构造函数中调用虚函数将会调用A类中的实现,因为在该调用发生时B的构造函数还未调用(B还没有初始化生成)。在A的析构函数中调用虚函数也会变成调用A类中的实现,原因是该调用发生时B已经调用了析构函数(B已经被销毁了)。
综上所述,在父类的构造函数和析构函数调用虚函数都不会达到你想要的多态效果,所以不要在构造函数和析构函数中调用虚函数。