Herb Sutter の有名な記事Virtualityは、次のように述べています。
ガイドライン #2: 仮想関数を private にすることを好みます。
簡単だ。これにより、派生クラスは関数をオーバーライドして、必要に応じて動作をカスタマイズできます。派生クラスによって仮想関数を呼び出し可能にすることで、仮想関数を直接公開する必要はありません (関数が単に保護されている場合に可能になります)。
以下のコードでは、private_base_func() は基本クラスで宣言されたプライベート仮想関数であり、被駆動クラス コンストラクターで呼び出されます。奇妙なことに、このコードは正常にコンパイルされ、被駆動クラスから基本クラスのプライベート仮想関数を呼び出します。上の発言と矛盾します。これは私を非常に混乱させています。
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;
}
返信ありがとうございます