Почему происходит сбой наследования (используется метод суперкласса) Переполнение стека

У меня есть следующие классы

#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? Если так и должно быть, как я могу получить желаемое поведение?

0

Решение

Вы должны отметить get_number как virtual чтобы это работало.

В C ++ вы получаете то, за что платите. Поскольку полиморфизм добавляет накладные расходы (память и время выполнения — указатель на таблицу виртуальных методов & динамическая диспетчеризация), вы должны четко указать, какие вызовы функций вы хотите разрешить во время выполнения. поскольку get_number не virtual, звонок от tell_me_the_number будет решен во время компиляции и будет вызвана версия базового класса.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]