6

私の質問は、おそらく例によって最もよく説明されるでしょう。

たとえば、基本クラスと派生クラスの 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()関数の独自の定義ではなく、オーバーライドされた関数を baseClass に呼び出させる方法はありますか?

4

2 に答える 2

18

オブジェクトがまだ完全に構築されていないため、コンストラクターから仮想メソッドを呼び出さないでください。基本的に、派生クラスはまだ存在しないため、そのメソッドを呼び出すことはできません。

于 2010-11-01T21:30:51.757 に答える
0

ほとんどの言語では、この動作は禁止されているか定義されていませんが、それには正当な理由があります。

これを考慮してください。基本クラスのコンストラクターはサブクラスのコンストラクターの前に実行されるため、サブクラスによって定義された変数は初期化されません。このような状況で、サブクラス化されたメソッドを呼び出してもよろしいですか?

最も簡単な方法は、スーパークラスで initialize() メソッドを定義し、サブクラス コンストラクターから initialize() を呼び出すことを忘れないことです。

于 2010-11-01T21:48:57.023 に答える