Я знаю, что этот вопрос должен был освещаться бесконечно много раз, но я искал предыдущие вопросы, и, похоже, ничего не всплывало.
Речь идет о наследовании и виртуальных функциях в 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.