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