如何为派生类创建一个只读成员?

时间:2013-03-17 10:48:31

标签: c++ inheritance readonly member

给定一个带有受保护成员的抽象基类,如何只为派生类提供读访问权?

为了说明我的意图,我提供了一个最小的例子。这是基类。

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成员,因为它必须可以被基类修改。我怎样才能产生预期的行为?

3 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分:4)

由于受保护的成员在派生类中是可见的,如果您希望该成员在派生类中只读,则可以将其设置为私有,并提供getter函数。

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

    public:
         int getValue() {return value;}

    private:
         int value;
}

这样你仍然可以改变基类中的值,并且它只是在子类中读取。

答案 2 :(得分:0)

继承的最佳实践指南应始终是将成员变量设为私有,将访问者功能设为公共。如果您只有从派生类调用的公共函数,则意味着您正在编写意大利面条代码。 (来源:Meyer的Effective C ++第22项)