編集:回答の要約
以下では、BはAのサブクラスです。
それは用語の問題です。Bのctor/dtorがAのインターフェースから借用されないという意味で、ctorsとdtorsは継承されません。クラスには少なくとも1つのコンストラクタがあり、デストラクタは1つだけです。
- コンストラクター:
- BはAからコンストラクターを継承しません。
- Bのctorが明示的にAのctorのいずれかを呼び出さない限り、AのデフォルトのctorはBのctor本体の前に自動的に呼び出されます(Bが作成される前にAを初期化する必要があるという考えです)。
- デストラクタ:
- BはAのdtorを継承しません。
- 終了後、Bのデストラクタは自動的にAのデストラクタを呼び出します。
謝辞: 特にOli CharlesworthとKosの回答に感謝します。私が最もよく理解したのは、Kosの回答を解決策として設定しました。
元の投稿
Googleで「C++デストラクタ継承サイト:stackoverflow.com」を検索すると、現在次の投稿が見つかります。
- コンストラクタとデストラクタの継承:3万人以上の評判を持つ2人のユーザーが、継承されていると言っていますが、そうではないと言っています
- 仮想デストラクタは継承されますか?:ここでは、デストラクタが継承されていないことを示すものは何も言及されていません
- C ++のデストラクタと継承?:コメントは、デストラクタが継承されていることを示しているようです
Q1:私も実践から知っていることですが、派生クラスのコンストラクターを明示的に定義しないと、親コンストラクターと同じプロトタイプで派生オブジェクトを初期化することはできません。それは正しいですか?
デストラクタが継承されているように見えることは投稿からかなり明らかですが、32kの評判を持つユーザーが継承されていないと言うという事実にはまだ戸惑っています。私はみんなの心を明確にするべき小さな例を書きました:
#include <cstdio>
/******************************/
// Base class
struct A
{
A() { printf( "\tInstance counter = %d (ctor)\n", ++instance_counter ); }
~A() { printf( "\tInstance counter = %d (dtor)\n", --instance_counter ); }
static int instance_counter;
};
// Inherited class with default ctor/dtor
class B : public A {};
// Inherited class with defined ctor/dtor
struct C : public A
{
C() { printf("\tC says hi!\n"); }
~C() { printf("\tC says bye!\n"); }
};
/******************************/
// Initialize counter
int A::instance_counter = 0;
/******************************/
// A few tests
int main()
{
printf("Create A\n"); A a;
printf("Delete A\n"); a.~A();
printf("Create B\n"); B b;
printf("Delete B\n"); b.~B();
printf("Create new B stored as A*\n"); A *a_ptr = new B();
printf("Delete previous pointer\n"); delete a_ptr;
printf("Create C\n"); C c;
printf("Delete C\n"); c.~C();
}
そしてここに出力があります(g ++ 4.4.3でコンパイルされました):
Create A
Instance counter = 1 (ctor)
Delete A
Instance counter = 0 (dtor)
Create B
Instance counter = 1 (ctor)
Delete B
Instance counter = 0 (dtor)
Create new B stored as A*
Instance counter = 1 (ctor)
Delete previous pointer
Instance counter = 0 (dtor)
Create C
Instance counter = 1 (ctor)
C says hi!
Delete C
C says bye!
Instance counter = 0 (dtor) // We exit main() now
C says bye!
Instance counter = -1 (dtor)
Instance counter = -2 (dtor)
Instance counter = -3 (dtor)
Q2:受け継がれていないと思っている人は、説明してもらえますか?
Q3:では、入力を使用してサブクラスのコンストラクターを呼び出すとどうなりますか?スーパークラスの「空のコンストラクター」も呼び出されますか?