0

派生クラスが、基底クラス ポインターから呼び出されたときに呼び出される独自のバージョンの関数を持たないという問題が発生しています。クラスをよりよく説明するために、以下のように定義されています

Class Foo
{
public:
  Foo();
  virtual ~Foo();

  virtual void Event();
}

//-----------------------

Class FooBar : public Foo
{
public:
  FooBar();

  virtual void Update() = 0;
  virtual void Draw() = 0;
}

//-----------------------

Class FinalFoo : public FooBar
{
public:
  FinalFoo();

  void Update();
  void Draw();

  void Event();
}

に似た他のクラスがありますFinalFoo。したがって、派生実装を呼び出すことを期待してEvent、オブジェクトへのポインターを呼び出そうとします。Fooただし、基本クラスのバージョンを呼び出しているように見えますが、それだけです

FinalFoo* myThing = new FinalFoo();
Foo* baseThing = myThing;

baseThing->Event();  // I expected this to call FinalFoo::Event()
4

1 に答える 1

2

上記のコードが修正されていると仮定すると、実際にはFinalFoo::Event(). 以下は、完全でコンパイル可能な例です。overrideまた、戦略的なポイントにキーワードを追加することに注意してください。override元のコードも追加すると (そして、このキーワードを認識しているコンパイラでコンパイルすると)、オーバーライドが 1 つではないことが指摘されると思います。

#include <iostream>

class Foo
{
public:
    virtual ~Foo() {}
    virtual void Event() { std::cout << "Foo::Event()\n"; }
};

//-----------------------

class FooBar : public Foo
{
public:
    virtual void Update() = 0;
};

//-----------------------

class FinalFoo : public FooBar
{
public:
    FinalFoo() {}

    void Update() override { std::cout << "FinalFoo::Update()\n"; }
    void Event() override  { std::cout << "FinalFoo::Event()\n"; }
};

int main()
{
    FinalFoo myThing;
    Foo* baseThing = &myThing;

    baseThing->Event();
}
于 2013-09-01T14:57:35.833 に答える