Почему это наследование терпит неудачу (используется метод суперкласса) 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 будет решен во время компиляции и будет вызвана версия базового класса.

Другие вопросы по тегам