Учитывая абстрактный базовый класс с защищенным членом, как я могу предоставить доступ на чтение только к производным классам?
Чтобы проиллюстрировать свое намерение, я приведу минимальный пример. Это базовый класс.
class Base
{
public:
virtual ~Base() = 0;
void Foo()
{
Readonly = 42;
}
protected:
int Readonly; // insert the magic here
};
Это производный класс.
class Derived : public Base
{
void Function()
{
cout << Readonly << endl; // this should work
Readonly = 43; // but this should fail
}
};
К сожалению, я не могу использовать const
член, так как он должен быть изменяем базовым классом. Как я могу произвести намеченное поведение?
Обычный способ сделать это состоит в том, чтобы сделать ваш член private
в базовом классе, и предоставить protected
сбруя:
class Base
{
public:
virtual ~Base() = 0;
void Foo()
{
m_Readonly = 42;
}
protected:
int Readonly() const { return m_Readonly; }
private:
int m_Readonly;
};
Поскольку защищенный член видим в производном классе, если вы хотите, чтобы член был доступен только для чтения в производном классе, вы можете сделать его закрытым и предоставить функцию получения.
class Base {
public:
Base();
virtual Base();
public:
int getValue() {return value;}
private:
int value;
}
Таким образом, вы все равно можете изменить значение в базовом классе, и оно доступно только для чтения в дочернем классе.
Рекомендации по передовому методу наследования должны заключаться в том, чтобы всегда делать переменные-члены частными, а функции доступа открытыми. Если у вас есть публичные функции, которые вы хотите вызывать только из производных классов, это означает, что вы пишете код спагетти. (источник: «Эффективный С ++» Мейера, пункт 22)