Как сделать член доступным только для производных классов?

Учитывая абстрактный базовый класс с защищенным членом, как я могу предоставить доступ на чтение только к производным классам?

Чтобы проиллюстрировать свое намерение, я приведу минимальный пример. Это базовый класс.

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 член, так как он должен быть изменяем базовым классом. Как я могу произвести намеченное поведение?

1

Решение

Обычный способ сделать это состоит в том, чтобы сделать ваш член private в базовом классе, и предоставить protected сбруя:

class Base
{
public:
virtual ~Base() = 0;
void Foo()
{
m_Readonly = 42;
}
protected:
int Readonly() const { return m_Readonly; }
private:
int m_Readonly;
};
8

Другие решения

Поскольку защищенный член видим в производном классе, если вы хотите, чтобы член был доступен только для чтения в производном классе, вы можете сделать его закрытым и предоставить функцию получения.

class Base {
public:
Base();
virtual Base();

public:
int getValue() {return value;}

private:
int value;
}

Таким образом, вы все равно можете изменить значение в базовом классе, и оно доступно только для чтения в дочернем классе.

4

Рекомендации по передовому методу наследования должны заключаться в том, чтобы всегда делать переменные-члены частными, а функции доступа открытыми. Если у вас есть публичные функции, которые вы хотите вызывать только из производных классов, это означает, что вы пишете код спагетти. (источник: «Эффективный С ++» Мейера, пункт 22)

0
По вопросам рекламы [email protected]