Предположим, я хочу иметь иерархию наследования, подобную этой.
class Base
class DerivedOne : public Base
class DerivedTwo : public Base
Базовый класс не предназначен для создания экземпляра и поэтому имеет некоторые чисто виртуальные функции, которые должны определять производные классы, что делает его абстрактным базовым классом.
Однако, есть некоторые функции, которые вы хотели бы, чтобы ваши производные классы получали из вашего базового класса. Эти функции изменяют частные элементы данных, которые будут иметь DerivedOne и DerivedTwo .
class Base {
public:
virtual void MustDefine() =0; // Function that derived classes must define
void UseThis(); // Function that derived classes are meant to use
};
Однако функция UseThis()
предназначена для изменения личных данных членов. Вот тут и возникает вопрос. Должен ли я предоставить фиктивные закрытые члены класса Base ? Должен ли я предоставить ему защищенные элементы данных (и, следовательно, производные классы не будут объявлять свои собственные частные элементы данных). Я знаю, что второй подход уменьшит инкапсуляцию.
Каков наилучший подход к такой ситуации? Если понадобится более подробное объяснение, я с радостью его предоставлю.