我有一個Message類的對象,它可以被寫入並隨後被更新。據我所看到的,MessageUpdate IS-A內留言: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 2012-04-09 14:10:18
有關使用虛擬基類的示例,請參閱http://stackoverflow.com/a/21607/13140以確保您的繼承樹中不會獲得「MessageWrite」的多個副本。所以你想只有MessageWrite能夠調用setReceiveTime()? – 2012-04-09 14:15:58
感謝dasblinkenlight,但我更喜歡@Als的方法,因爲它可以節省多重繼承的運行時成本 – vid 2012-04-09 14:16:44