Effective C+--マルチステートベースクラスの虚析関数を宣言
1.マルチステートベースクラスはvirtual構造関数を宣言する必要がある.ベースクラスでないクラスはvirtual構造関数を宣言する必要はありません.そうしないと、虚関数がクラスの体積を増加させるため、悪い考えです.1つの心得は、1つのクラスに少なくとも1つのvirtual関数が含まれている場合、構造関数をvirtualとして宣言する必要があります.3.クラスにvirtual構造関数が含まれていない場合、ベースクラスの場合、サブクラス構造関数が呼び出されず、メモリ漏洩のリスクが発生するために使用されます.たとえば、stringクラス、stlコンテナクラスなどはvirtual構造関数を含まないクラスです.次の例には2つの機能があります.1、vptrポインタの存在を説明する2、ベースクラスの構造関数がvirtualキーワードの有無で大きく異なり、サブクラスの構造関数が呼び出されるかどうかに関係します.
4.純虚関数は、ベースクラスとしてクラスを抽象クラスにすることができる.他の純粋な虚関数がない場合、構造関数を純粋な虚関数として宣言するのは良いアイデアです.このようなクラスは、ベースクラスとしてもよく、サブクラスの構造関数が呼び出されないことによるメモリ漏洩の問題を心配する必要はありません.注意:抽象クラスが継承されると、サブクラスの構造関数が抽象クラスの構造関数を呼び出すため、この場合、純虚関数は定義されていないため、必然的に接続エラーを招き、解決策は抽象クラスの純虚構造関数に空の実装体を与える.
#include
using std::cout;
using std::cin;
using std::endl;
class Animal
{
public:
Animal()
{
cout << "Animal--- " << endl;
}
virtual ~Animal()
{
cout << "Animal--- " << endl;
}
};
class Tiger :public Animal
{
public:
Tiger()
{
cout << "Tiger--- " << endl;
}
~Tiger()
{
cout << "Tiger--- " << endl;
}
};
int main()
{
cout << sizeof(Animal) << endl;//4, virtual 1
Animal *tiger = new Tiger();
delete tiger;// Animal virtual , delete tiger , ,
cin.get();
return 0;
}
4.純虚関数は、ベースクラスとしてクラスを抽象クラスにすることができる.他の純粋な虚関数がない場合、構造関数を純粋な虚関数として宣言するのは良いアイデアです.このようなクラスは、ベースクラスとしてもよく、サブクラスの構造関数が呼び出されないことによるメモリ漏洩の問題を心配する必要はありません.注意:抽象クラスが継承されると、サブクラスの構造関数が抽象クラスの構造関数を呼び出すため、この場合、純虚関数は定義されていないため、必然的に接続エラーを招き、解決策は抽象クラスの純虚構造関数に空の実装体を与える.