Вы правы в том, что для переопределения функции в производном классе она должна наследовать ее от базового класса (кроме того, функция базового класса должна быть виртуальной).Однако вы ошибаетесь в своем предположении, что виртуальные функции не наследуются.Например, следующее работает хорошо (и фактически является известной идиомой для проверки предусловия / постусловия):
class Base
{
public:
void operate_on(some thing);
private:
virtual void do_operate_on(some thing) = 0;
};
void Base::operate_on(some thing)
{
// check preconditions
do_operate_on(thing);
// check postconditions
}
class Derived: public Base
{
// this overrides Base::do_operate_on
void do_operate_on(some thing);
};
void Derived::do_operate_on(some thing)
{
// do something
}
int main()
{
some thing;
Base* p = new Derived;
// this calls Base::operate_on, which in turn calls the overridden
// Derived::do_operate_on, not Base::do_operate_on (which doesn't have an
// implementation anyway)
p->operate_on(thing);
delete p;
}
Чтобы увидеть, что частные методы действительно наследуются, нужно посмотреть на сообщения об ошибках, сгенерированныеследующий код:
class Base
{
private:
void private_method_of_B();
};
class Derived:
public Base
{
};
int main()
{
Derived d;
d.private_method_of_B();
d.method_that_does_not_exist();
}
Попытка скомпилировать это с помощью g ++ приводит к следующим сообщениям об ошибках:
privatemethodinheritance.cc: In function 'int main()':
privatemethodinheritance.cc:4: error: 'void Base::private_method_of_B()' is private
privatemethodinheritance.cc:15: error: within this context
privatemethodinheritance.cc:16: error: 'class Derived' has no member named 'method_that_does_not_exist'
Если класс Derived не наследует эту функцию, сообщение об ошибкеодинаковые в обоих случаях.