【问题标题】:Can I make a public member variable private in a derived class?我可以在派生类中将公共成员变量设为私有吗?
【发布时间】:2010-09-02 01:21:55
【问题描述】:

我想在派生类中将基类中的公共成员设为私有,如下所示:

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

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

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

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

【问题讨论】:

标签: c++ class inheritance


【解决方案1】:

简短的回答:不。 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
};

【讨论】:

    【解决方案2】:

    是的,使用声明 technically 允许您这样做。

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

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

    几个观察:

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 2020-09-07
      • 2014-09-22
      • 2015-05-04
      • 1970-01-01
      • 2021-03-08
      • 2018-11-12
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多