我可以在派生类中将公共成员变量设为私有吗?

时间:2010-09-02 01:21:56

标签: c++ class inheritance

我想在派生类的基类私有中创建一个公共成员,如下所示:

class A {
public:
    int   x;
    int   y;
};

class B : public A {
    // x is still public
private:
    // y is now private
    using y;
};

但显然“使用”不能以这种方式使用。有没有办法在C ++中做到这一点?

(我不能使用私有继承,因为A的其他成员和函数必须仍然是公共的。)

2 个答案:

答案 0 :(得分:3)

简答:不。 Liskov替换和公共继承的性质要求您可以使用A(即其公共成员)执行的所有操作也可以由B完成。这意味着你无法隐藏公共方法。

如果您试图隐藏公开fields,那么您无能为力。要“隐藏”公共方法,您可以执行以下操作:

class B {
    // x is still public
    int x() { return a.x(); }
private:
    A a;
    // y is now private since you didn't add a forwarding method for it
};

答案 1 :(得分:3)

是的,使用声明technically可以让您这样做。

您必须使用using A::y代替using y

但是,请认真评估这样做是否符合设计意义。

很少有观察结果:

  1. 您的课程不应包含公开数据。应该尽可能避免这种情况。如果你坚持这个设计原则,你可能不需要在派生类中将它设为私有。

  2. 坚持LSP。如果基类具有公共方法,并且除非您正在进行私有继承,如果派生类使用声明使基类方法变为私有,则客户端将会感到困惑。