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;
}
返信ありがとうございます