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

Col*_*len 5 c++ inheritance class

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

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

class B : public A {
    // x is still public
private:
    // y is now private
    using y;
};
Run Code Online (Sandbox Code Playgroud)

但显然"使用"不能以这种方式使用.有没有办法在C++中这样做?

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

Chu*_*dad 5

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

你必须使用using A::y而不是using y

然而,请认真评估这样做是否具有设计意义。

一些观察:

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

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


mun*_*ent 3

简短的回答:不。里氏替换和公共继承的性质要求你可以用 an A(即它的公共成员)做的一切也可以通过 来完成B。这意味着您无法隐藏公共方法。

如果你想隐藏 public 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
};
Run Code Online (Sandbox Code Playgroud)