Итак:
class A {
public:
void f() { std::cout << "A::f\n"; }
};
class B : public A {
public:
void f() { std::cout << "B::f\n"; }
};
Пока компилятор знает, что объект на самом деле является B, он будет вызывать f () в B. Но это не всегда так:
void callF(A* a)
{
a->f();
}
B b;
callF(&b); // prints A::f
Если вы хотите, чтобы такие функции, как callF
, вызывали правильную функцию f (), сделайте ее virtual
. Как правило, вы делаете функции виртуальными, если имеет смысл переопределить их в классе-потомке. Это часто относится к защищенным функциям.