我正在阅读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”有什么问题(可能很危险),以克服在构造函数中调用虚函数的问题。