2

間違っているかもしれませんが、これは非常に基本的な質問のようです。突然、継承チェーンが機能しなくなりました。小さな基本的なテスト アプリケーションを作成したことで、間違っていたのは私であることが証明されました (したがって、コンパイラを責めることはできません)。

仮想関数でデフォルトの動作をする基本クラスがあります。子クラスはそれから派生し、動作を変更します。

#include <iostream>

class Base
{
public:
    Base() { print(); }
    ~Base() {}

protected:
    virtual void print() { std::cout << "base\n"; }
};

class Child : public Base
{
public:
    Child() {}
    ~Child() {}

protected:
    virtual void print() { std::cout << "child\n"; }
};

int main()
{
    Base b;
    Child c;
}

これは以下を出力します:

base
base

Child インスタンスが作成されると、なぜ Base::print() が呼び出されるのですか? virtual キーワードを使うことで、関数を派生クラスに置き換えることができると思いました。

どの時点で私は自分自身を混乱させましたか?

4

2 に答える 2

18

子クラスがまだ完全に初期化されていないため、コンストラクターで仮想メソッドを呼び出していますが、これは機能しません。

この StackOverflow questionも参照してください。

于 2009-02-03T13:25:03.527 に答える
4

あなたの現在の問題は、他の人が言及したコンストラクターからの仮想メソッド呼び出しですが、デストラクタを仮想化していないことに気付きました。それは通常悪いことです。あなたの場合、デストラクタはnopであり、デストラクタを持つオブジェクトであるメンバーはありません...しかし、コードが変更されると、悪いことが起こりやすくなります。

于 2009-02-03T14:39:17.903 に答える