TPS
TPS

Reputation: 2137

Derived Class Function Not Called

I am experiencing a problem where a derived class does not have it's own version of a function called when it is called from a base class pointer. To better explain the classes are defined as below

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();
}

There are other classes similar to FinalFoo. So I attempt to call Event on a pointer to a Foo object expecting that it would call the derived implementation. However, it would appear that it calls the base class version and that is all

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

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

Upvotes: 1

Views: 6944

Answers (1)

Dietmar Kühl
Dietmar Kühl

Reputation: 153802

Assuming the above code is corrected, it actually does call FinalFoo::Event(). below is a complete and compilable example. Note, that it also adds the keyword override in strategic points: I'd bet that adding override in the original code, too (and compiling with a compiler aware of this keyword) would point out that your override isn't one.

#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();
}

Upvotes: 2

Related Questions