Вам нужно сделать вашу функцию виртуальной, чтобы a()
всегда ссылался на реализацию a()
в реальном классе объекта:
class A {
public:
virtual int a() { //<<<<<<<<--------
return 6;
}
int b() {
return a() - 2;
}
virtual ~A() = default;
};
В вашей версии с не виртуальной функцией тело b()
вызывает единственный известный ему a()
, то есть A::a()
.
В качестве хорошей практики и во избежание неприятных ошибок при определении виртуальной функции в производных классах укажите, что вы переопределяете виртуальную функцию:
class B: public A {
public:
int a() override {
return 10;
}
};
Еще одна хорошая практика - предусмотреть виртуальный деструктор в базовом классе.