2013-03-17 3 views
1

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

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

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

+0

Кроме того, чтобы сделать его постоянным, вы не можете. –

+2

Не могли бы вы сделать это частным и просто предоставить защищенный метод геттера? –

+1

Вы должны определить конструктор для инициализации 'Readonly'. –

ответ

8

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

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

Гораздо лучше, чем мой ответ, +1. – jrok

+0

Спасибо, иногда это так просто! – danijar

+1

Оставьте ключевое слово 'inline'; это 'inline' в силу определения в декларации. –

4

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

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

    public: 
     int getValue() {return value;} 

    private: 
     int value; 
} 

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

0

Руководства по наилучшей практике для наследования должны заключаться в том, чтобы всегда публиковать функции-члены и функции доступа. Если у вас есть публичные функции, которые вы хотите только вызывать из производных классов, это означает, что вы пишете код спагетти. (источник: Meyer's Effective C++ item 22)

+0

Что такое «защищенные» ключевые слова? ;) – danijar

Смежные вопросы