基本クラスからオーバーライドされた関数を呼び出しますか?
-
28-09-2019 - |
質問
私の質問はおそらく例で最もよく説明されるでしょう。
たとえば、2つのクラスがあります。基本クラスと派生クラス:
class baseClass
{
public:
baseClass()
{
foo();
}
virtual bool foo() { printf("baseClass"); return false;}
};
class derivedClass : public baseClass
{
public:
bool foo()
{
printf("derivedClass");
return true;
}
};
のインスタンスを作成するとき derivedClass
, 、コンストラクター baseClass
呼び出されます foo()
コンストラクターから呼び出されます。問題は、Baseclass 'コンストラクターが自分自身を呼んでいることです foo()
そして、オーバーライドされていません foo()
派生クラスがオーバーライドしたこと。とにかく、ベースクラスにオーバーライドされた関数を呼び出すようにするために、それは関数の独自の定義ではありませんか?
解決
オブジェクトがまだ完全に構築されていないため、コンストラクターから仮想メソッドを呼び出すべきではありません。基本的に、派生クラスはまだ存在していないため、その方法を呼び出すことはできません。
他のヒント
ほとんどの言語では、この動作は、正当な理由を伴う禁止または未定義のいずれかです。
これを考慮してください。ベースクラスのコンストラクターは、サブクラスコンストラクターの前に実行されるため、サブラスによって定義されたVARは無効化されます。そのような状況下でサブクラス化された方法を呼び出したいですか?
最も単純な代替品は、スーパークラスのinitialize()メソッドを定義し、サブクラスコンストラクターからinitial()を呼び出すことを忘れないでください。
所属していません StackOverflow