Почему это наследование терпит неудачу (используется метод суперкласса) C++
У меня есть следующие классы
#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? Если это так, как я должен получить поведение, которое я хочу?
1 ответ
Решение
Вы должны отметить get_number
как virtual
чтобы это работало.
В C++ вы получаете то, за что платите. Поскольку полиморфизм добавляет накладные расходы (память и время выполнения - указатель на таблицу виртуальных методов и динамическую диспетчеризацию), вам необходимо четко указать, какие вызовы функций нужно разрешить во время выполнения. поскольку get_number
не virtual
, звонок от tell_me_the_number
будет решен во время компиляции и будет вызвана версия базового класса.