【发布时间】:2014-03-05 20:03:17
【问题描述】:
这是关于“保护”的,解释为:“当一个类继承另一个类时,派生类的成员可以访问从基类继承的受保护成员。”但是,看看这段代码:
class Base {
public:
Base( int m ) : member(m){}
protected:
int member;
};
class Derived : public Base { // one of several subclasses
public:
Derived( int m ) : Base(m), value(10) {}
int diff( Base x ){
return value - x.member;
}
private:
int value;
};
派生访问“x.member”,它在其基类中受到保护,对吗?但是编译器会标记一个错误,“Base::member is protected”。而且,在考虑了一分钟之后,我不得不同意编译器。
问题来了:我怎样才能做到这一点,同时将信息隐藏的损失降到最低?
- 显然,将“成员”公开编译,但这违背了初衷。
- 使用 Base 中的“朋友”机制让子类访问“成员”(以及所有其他私有和受保护的内容)更糟糕(除了超类与其自己的子类的愚蠢绑定 - 维护噩梦)。
- 在简单示例中,public int getMember(){ return member; } 是可以接受的。但如果成员的类型是 X*,那么您能做的最好的事情就是 public const X* getMember(){...}。
我错过了什么吗?
【问题讨论】:
-
只定义
int diff( Derived x ),还是不定义? -
同样,在阅读您的第 1 点和第 3 点时,可以得出结论,成员保护的意义在于它可以被读取但不能被更改。所以 get 方法会做得很好。在 Base 的构造函数列表中初始化的成员的公共 const-reference 或 const-pointer-to-const 也是可能的。你的第 3 点和“你能做的最好的...... const X*”取决于你想要什么:get 方法无论如何都会返回值。所以你不能用
X* get()改变X* 类型成员的值。只有它指向的东西。 -
如何创建一个函数
int diff(Derived d, Base b)并让这个函数成为两个类的friend? -
@mb84 diff 使用类型 Base 以使其对所有可能的子类型有用。 (也许 Base* 会使意图更清晰,但它不是我所追求的多态性。) - 我原来的情况是成员的类型为 char*,我不喜欢返回这个指针,即使是 const char*。
-
@rozina 好的,如果没有太多地方需要这种访问权限的话。
标签: c++ inheritance protected