C++の虚構造関数,C++トラップ

1070 ワード

#include <iostream>
//                   。
//             
using namespace std;
class A
{
  public:
   virtual~A(){
   cout<<"~A()"<<endl;}
};
class B:public A
{
  public:
   ~B(){
   cout<<"~B()"<<endl;}
};
int main()
{
   B cb;
   A *pa=&cb;
   cout<<"***********"<<endl;
   delete pa;
   cout<<"***********"<<endl;
    return 0;
}

上記のプログラムを実行し、Aクラスのvirtualを削除してみます.
星号の向こうに1行足りないことに気づいたでしょう.ベースクラスポインタが派生を指すと、最終的なプロファイルでは、派生クラスの余分な物質が削除されていないなどの問題が発生します.
virtual関数の実行は、虚関数テーブルによって行われますが、通常はそうではありません.
すべて、構造関数が非virtualである場合は、ベースクラスの構造関数のみが実行され、virtualである場合は、テーブルに従います.
このとき,既に虚構造関数として認定されていれば,従来のベースクラス構造関数の位置は派生クラス構造関数に置き換えられる.
つまり、解析時には派生クラスの解析関数が自動的に実行され、派生クラスの解析関数が実行されると、ベースクラスの解析関数が自動的に実行されます.
 
 
メンバーf()const関数にはデフォルト*thisがありますが、静的関数はありません.static f()const;この定義は間違っている