У меня есть следующие классы
#include <iostream>
using namespace std;
class A {
public:
int get_number() {return 1;}
void tell_me_the_number() {
cout << "the number is " << get_number() <<"\n";
}
};
class B: public A {
public:
int get_number() {return 2;}
};int main() {
A a;
B b;
a.tell_me_the_number();
b.tell_me_the_number();
}
Я ожидаю, что это выведет мне:
the number is 1
the number is 2
Но на самом деле я получаю вдвое больше строки номер 1.
Разве метод get_number () класса B не должен вызываться, когда это класс B? Если так и должно быть, как я могу получить желаемое поведение?
Вы должны отметить get_number
как virtual
чтобы это работало.
В C ++ вы получаете то, за что платите. Поскольку полиморфизм добавляет накладные расходы (память и время выполнения — указатель на таблицу виртуальных методов & динамическая диспетчеризация), вы должны четко указать, какие вызовы функций вы хотите разрешить во время выполнения. поскольку get_number
не virtual
, звонок от tell_me_the_number
будет решен во время компиляции и будет вызвана версия базового класса.
Других решений пока нет …