У меня есть 3 класса: A , B , C . B наследуется от A , а C наследуется от B (поэтому C является внуком A).
Каждый объект имеет функцию talk () , которая отображает текст, в A и B , это виртуально.
Позвольте иметь снаружифункция вызов ( A & a) , который принимает объект A по ссылке и вызывает функцию talk () .
отправка объекта C для функции, она использует talk () из B вместо C , даже в B talk () является виртуальным.
Почему это так?Как заставить его вызывать версию из C ?
#include <iostream>
using namespace std;
class A {
public:
virtual void talk() = 0;
virtual void say() = 0;
};
class B : public A {
public:
virtual void talk() // Why C does not overrides this?
{ cout << "hello\n"; }
};
class C : public B {
public:
void talk (int a) // It should override B.talk();
{ cout << "bye\n";}
virtual void say() { cout << "my name\n"; }
};
void call(A &a) {
a.talk(); // Why does it call virtual talk() from B rather than from C?
a.say(); // This was found so it knows about object C
}
int main() {
C c;
call(c);
system("PAUSE");
return 0;
}
Я ожидаю, что вызов (A & a) принимает самую дальнюю версию наследования, если каждый класс между виртуальный разговор ()