Вызов виртуальной функции в подклассе из суперкласса

Я знаю, что этот вопрос должен был освещаться бесконечно много раз, но я искал предыдущие вопросы, и, похоже, ничего не всплывало.

Речь идет о наследовании и виртуальных функциях в C ++. У меня проблема с вызовом виртуальных функций в подклассах из суперкласса.

Позвольте мне привести пример. Начнем с трех классов, которые наследуются друг от друга.

class A {

    void foo() { bar() }
    virtual void bar() { }

};

class B : public A {

    virtual void bar() { }

};

class C : public B {

    virtual void bar() { // do something }

};

Теперь я хочу иметь переменную, объявленную как B *, но созданную как C *.

B* myObject = new C();
myObject->foo();

Когда я делаю это и вызываю foo () для myObject, тогда A :: foo () вызывает bar (). Но вызывается только B :: bar (), а не C :: Bar (), которым на самом деле является myObject, даже если он объявлен как B, что опять же влияет на то, что «// ничего не делать» не выполняется.

Как мне сказать A :: foo (), что он должен смотреть на низшую реализацию?

Имеет смысл?

// Trenskow

РЕДАКТИРОВАТЬ:

C :: Foo не проблема. Foo вызывается в классе A, поскольку это единственное место, где он реализован. Проблема возникает, когда A: Foo вызывает Bar (). Затем вызывается B: Bar, а не C :: Bar.

Возможно, проблема в том, что в моей реализации я получаю только указатель void * на объект в A.

Вот так:

void A:Foo(void *a) {

    A* tmpA = static_cast<A*> (a);
    tmpA->bar();

}

Теперь компилятор считает, что tmpA является A. Но каким-то образом ему удается понять, что это B *, и вызывает B :: Bar, когда на самом деле tmpA является C * и он должен вызывать C :: Bar.

5
задан Trenskow 22 August 2010 в 09:39
поделиться