знаменитая статья Герба Саттера Virtuality, говорится следующее:C++ Почему я могу вызвать частную виртуальную функцию базового класса из drived класса?
Руководство # 2: Предпочитаю делать виртуальные функции частных.
Это очень просто. Это позволяет производные классы переопределить функции для настроить поведение по мере необходимости, без дальнейшего воздействия виртуальных функции непосредственно, делая их вызываемая производными классами (как было бы возможно, если функции были только защищены)
В приведенном ниже коде private_base_func() является частной виртуальной функцией, объявленной в базовом классе и вызываемой в drived class constructor, Strangely, этот код компилируется отлично, и он вызывает частную виртуальную функцию базового класса из drived класса, который противоречит сказанному выше. Это меня очень смущает.
class base
{
public:
base() {}
virtual ~base(){}
private:
virtual void private_base_func()
{
std::cout << "Base Class invoke" << std::endl;
}
};
class drived : public base
{
public:
drived()
{
private_base_func(); // this line should not compile
}
private:
// Overriding base class virtual function
void private_base_func()
{
std::cout << "Drived class invoke" << std::endl;
}
};
int main()
{
base* ptr = new drived();
return 0;
}
Спасибо авансов за ваш ответ