我正在阅读 Effective C++,其中有“第9条:不在构造和析构过程中调用虚函数”。我想知道即使违反这个规则,我的代码是否仍然可以正常工作:
using namespace std;
class A{
public:
A(bool doLog){
if(doLog)
log();
}
virtual void log(){
cout << "logging A\n";
}
};
class B: public A{
public:
B(bool doLog) : A(false){
if(doLog)
log();
}
virtual void log(){
cout << "logging B\n";
}
};
int main() {
A a(true);
B b(true);
}
这种方法有问题吗?当我做更复杂的事情时,我会遇到麻烦吗?
我觉得大多数答案没有理解我所做的,他们只是再次解释为什么从构造函数调用虚函数可能存在危险。
我想强调一下,我的程序输出如下:
logging A
logging B
当构造函数被调用时,我希望能够记录A,当它被构建时,记录B。这正是我想要的!但我想知道您是否发现我的“hack”存在任何错误(可能危险),以克服在构造函数中调用虚拟函数的问题。