给定一个带有受保护成员的抽象基类,如何只为派生类提供读访问权?
为了说明我的意图,我提供了一个最小的例子。这是基类。
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 :(得分: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项)