У меня есть объект класса Message, который можно записать и впоследствии обновить. Насколько я могу видеть, MessageUpdate IS-A 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 можно просто сделать базовым классом, но есть rub: он приводит к шаблону алмаза в случае, если я хочу расширить класс сообщений. Рассмотрение:
class MessageUpdate {...};
class MessageWrite: public MessageUpdate {...};
//Now, while extending:
class AdminMessageUpdate:public MessageUpdate {...};
class AdminMessageWrite: public AdminMessageUpdate, public MessageWrite //DIAMOND Pattern!!
В чем разница в моем понимании наследства? И есть ли совершенно другой способ достичь этой логики без множественного наследования (как показано в последнем фрагменте кода)?
Алмазный шаблон ОК до тех пор, пока вы не боитесь [виртуальное наследование] (http://en.wikipedia.org/wiki/Virtual_inheritance). – dasblinkenlight
См. Http://stackoverflow.com/a/21607/13140 для примера использования виртуального базового класса, чтобы гарантировать, что вы не получите несколько копий «MessageWrite» в дереве наследования. Итак, вы хотите, чтобы ТОЛЬКО MessageWrite мог вызвать setReceiveTime()? –
спасибо dasblinkenlight, но я бы предпочел использовать метод @Als, так как он экономит мне время выполнения нескольких наследований, а также – vid