仮想メンバーを非公開と宣言するすべての呼びかけにもかかわらず、この議論は単純に水を保持しません。多くの場合、仮想関数の派生クラスのオーバーライドは、基本クラスバージョンを呼び出す必要があります。宣言されている場合はできませんprivate
。
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
基本クラスのメソッドを宣言する必要がありprotected
ます。
次に、メソッドをオーバーライドする必要があるが、呼び出さないことをコメントで示すという醜い方法をとる必要があります。
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
したがって、ハーブサッターのガイドライン#3 ...しかし、馬はとにかく納屋から出ています。
protected
派生クラスの作成者が保護された内部構造を理解して適切に使用することを暗黙的に信頼しているものを宣言する場合、friend
宣言がprivate
メンバーに対するより深い信頼を示唆する方法と同じです。
その信頼に違反することで悪い振る舞いをするユーザー(たとえば、ドキュメントを読まないようにして「無知」のラベルが付けられている)は、自分のせいにしかできません。
更新:私は、プライベート仮想関数を使用して、この方法で仮想関数の実装を「チェーン」できると主張するフィードバックがありました。もしそうなら、是非見たいと思います。
私が使用しているC ++コンパイラでは、派生クラスの実装でプライベートベースクラスの実装を呼び出せません。
C ++委員会がこの特定のアクセスを許可するために「プライベート」を緩和した場合、私はすべてプライベート仮想関数を使用することになります。現状では、馬が盗まれた後も納屋のドアをロックすることをお勧めします。