コンストラクタで仮想関数を呼び出すことはできませ1.
例えば
クラスベース{
パブリック:
ベース();
仮想ボイド関数func1()のconst = 0;
}
ベース::ベース()
{
// ...
関数func1();
}
派生クラス:公衆基地
{
パブリック:
仮想空関数func1()constは、
}
サブクラス次いで、最初の呼び出しは関数func1を呼び出して、基本クラスのコンストラクタベースである場合、Dが実行される派生関数func1が基底クラスの純粋仮想関数であるため、基本コンストラクタに適切でない定義されていません派生オブジェクトがまだ確立されていません。それは、基本クラスのコンストラクタが実行されるとき、オブジェクトの派生クラスの一部は、状態を初期化されています。
あなたは、たとえば、親クラスのコンストラクタのサブクラスに情報を送信することにより、コンストラクタで、サブクラスのインターフェイスを呼び出したい場合は:
クラスBase
{
パブリック:
ベース(文字列str)。
空はfunc1(String str)文字。
}
ベース(文字列str)
{
// ....
関数func1(STR)。
}
派生クラス:公衆基地
{
パブリック:
派生(STR)
:ベース(STR)
{// ...}
}
2.デストラクタで仮想関数呼び出しは無意味です
基底クラスのコンストラクタは、基本クラスのコンストラクタの派生クラスの仮想関数呼び出しを実行したときとちょうど反対に比べ派生オブジェクトのコンストラクタ破壊のシーケンスの順序、派生クラスの時間部分があったため破壊されました。即ち、基本クラスのメンバは、オブジェクトが未完成状態にあるとき。
要約すると:コンストラクタやデストラクタが仮想関数を呼び出した場合、我々はコンストラクタやデストラクタの機能バージョンを実行すべき仮想の種類に対応属します。