繁体   English   中英

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

[英]Can I make a public member variable private in a derived class?

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

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

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

但是显然“使用”不能那样使用。 有什么办法可以在C ++中做到这一点?

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

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

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

您必须using A::y而不是using y

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

很少观察到:

  1. 您的课程不应包含公开数据。 应该尽可能避免这种情况。 如果您遵循此设计原则,则可能无需在派生类中将其设为私有。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM