すべての仮想関数をプライベートまたはプロテクトとして基底クラス インターフェイスを構築するのには十分な理由があります (これを参照してください)。しかし、派生クラス (外部クライアントの手に渡っている可能性があります) がプライベート仮想関数をパブリックとして作成するのをどのように防ぐのでしょうか? Virtually Yoursでは、著者はこの問題について語っていますが、解決策については議論されていません。
編集:あなたの答えから、私が以前に考えたように、これを防ぐ方法はないようです。しかし、この状況では失敗しやすい (クライアントが保護された仮想関数に確実にアクセスする) ため、コンパイラがそのような使用法について警告するのは理にかなっています。g++でテストしてみました。まず、次のように書きました。
class A {
protected:
virtual void none() { return; }
};
class B: public A {
public:
void none() { return; }
};
g++ -c -Wall -pedantic file.cpp
エラーなしでコンパイルされました。追加-Weffc++
すると警告が表示されました: warning: ‘class A’ has virtual functions and accessible non-virtual destructor
、これは理にかなっています。仮想デストラクタを追加した後、警告はありません。したがって、この間違いやすいケースには警告はありません。