仮想デストラクタが必要であることはわかっています。実行時の多態性におけるコンストラクタの振る舞い
Base *bptr = new Derived();
delete bptr;
派生クラスオブジェクトは、基本クラスのポインタによって指し示され、オブジェクトが範囲外になるとデストラクタが仮想でない限り、唯一の基本クラスのデストラクタが呼び出される場合。
この場合、どのようにコンストラクターが正しく動作するのでしょうか。 BaseポインタがDerivedオブジェクトを指しているので、Baseコンストラクタだけが呼び出されているはずです。どのように派生クラスのコンストラクタを適切に呼び出すのですか?
私は理由を説明してください。
"デストラクタが仮想でない限り、派生クラスオブジェクトがベースクラスポインタによって指し示され、オブジェクトがスコープから外れると、Baseクラスデストラクタだけが呼び出されます。 - 派生クラスのオブジェクトが有効範囲外になると、派生クラスのデストラクターが呼び出され、オブジェクトへの他の通常ポインターの存在とタイプは関係ありません。スコープの外に出る通常のポインタがあれば、何も呼び出されません。スマートポインタはデストラクタを呼び出すことができます。その場合、仮想ディスパッチが実際に派生クラスのものであることを確認する必要があります。 'new X'にはスコープはありません。 –
私は、 "delete bptr"が実行されると、デストラクタが仮想でない限り、Baseクラスのデストラクタだけが呼び出されると言っていました。 – user166002