私は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 がログに記録されます。そして、それが私が欲しいものです!しかし、コンストラクターで仮想関数を呼び出す際の問題を克服するために、私の「ハック」で何か問題がある (潜在的に危険な) ものを見つけたかどうかを尋ねています。