コンパイラが仮想テーブルを使用している場合、Bの仮想テーブルはどのようになりますか?ウィルA::~A
内側もB
の仮想テーブル?
struct A{
virtual ~A()
{
cout<<"A::destructor"<<endl;
}
};
struct B:public A{
~B()
{
cout<<"B::destructor"<<endl;
}
};
いいえ、~A
の仮想テーブルにはありませんB
。それは持っています~B
デストラクタに対応するエントリに。結局のところ、デストラクタが仮想として宣言されると、派生するすべてのデストラクタは仮想になります。
したがって、delete
式は常に正しいデストラクタを呼び出します。方法ベースサブオブジェクトA
のB
破棄され、コンパイラによって簡単に達成することができる静的にコールを注入~A
の終わりに~B
。概念的には次のようになります。
~B()
{
cout<<"B::destructor"<<endl;
//User defined code ended. Compiler generated one is here
static_cast<A*>(this)->A::~A();
}
これはすべて、可能な実装の詳細を深く掘り下げています。これはいずれもC ++標準自体ではカバーされていません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加