私は、Messageクラスのオブジェクトを持っています。私の知る限り見ることができるように、MessageUpdateは、IS-MessageWrite:C++:派生クラスのメソッドアクセスを制限する
class MessageWrite
{
protected:
void setVersion(int version_) {...}
void setReceiveTime(int tmReceive_) {...}
Message _msg;
};
class MessageUpdate:public MessageWrite
{
//ONLY setVersionShould be accessible here, NOT setReceiveTime
};
これを達成するのを助けることができますメソッドのアクセスレベルと継承レベルの組み合わせがありますか?
私はMessageUpdateを単純に基底クラスにすることができますが、メッセージクラスを拡張したい場合はダイヤモンドパターンになります。検討してください:
class MessageUpdate {...};
class MessageWrite: public MessageUpdate {...};
//Now, while extending:
class AdminMessageUpdate:public MessageUpdate {...};
class AdminMessageWrite: public AdminMessageUpdate, public MessageWrite //DIAMOND Pattern!!
私は継承の理解のギャップはどこですか?そして、多重継承なしでこのロジックを達成するための全く別の方法がありますか(後者のコードのように)?
ダイヤモンドパターンは限りOKですが、[仮想継承] (http://en.wikipedia.org/wiki/Virtual_inheritance)。 – dasblinkenlight
仮想基底クラスを使用して、継承ツリーに「MessageWrite」の複数のコピーを作成しないようにする例については、http://stackoverflow.com/a/21607/13140を参照してください。ですから、MessageWriteだけがsetReceiveTime()を呼び出せるようにしたいのですか? –
dasblinkenlightに感謝しますが、私は複数の継承のランタイムコストも節約できるので、@Alsの方法を好むでしょう – vid