多くの情報源、書籍などでは、「子クラスのコンストラクターで this->virtualFunction を呼び出さないでください」と書かれており、一部の情報源では、それを行ってはならない理由が説明されています。構築の時点では、クラスはまったく作成されていないためです。したがって、子コンストラクターから呼び出される仮想関数は、基本クラスの関数になります。これは、子コンストラクタ本体で、そのクラスの VPTR がベース VTABLE を指していることを意味します。
だから私の質問は、
子クラスの VPTR が仮想テーブルでアドレス指定するためにオーバーライドされるオブジェクト構築の瞬間は何ですか? 自動生成されたコードの一部は、コンストラクター本体の最後またはコンストラクター本体が実行された後にそれを行うと思います。
2 番目の質問は、
なぜ VPTR が構築の最後に上書きされるのですか? 多分それにはいくつかの重要な理由がありますか?コンストラクタ本体の開始時または基本クラスの構築後に VPTR をオーバーライドできないのはなぜですか?
Child::Child() :
Base()
//<----- Why not here?
//members initialization
{
//<----- Why not here?
//code
}