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