我想在派生类的基类私有中创建一个公共成员,如下所示:
class A {
public:
int x;
int y;
};
class B : public A {
// x is still public
private:
// y is now private
using y;
};
但显然“使用”不能以这种方式使用。有没有办法在C ++中做到这一点?
(我不能使用私有继承,因为A的其他成员和函数必须仍然是公共的。)
答案 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
但是,请认真评估这样做是否符合设计意义。
很少有观察结果:
您的课程不应包含公开数据。应该尽可能避免这种情况。如果你坚持这个设计原则,你可能不需要在派生类中将它设为私有。
坚持LSP。如果基类具有公共方法,并且除非您正在进行私有继承,如果派生类使用声明使基类方法变为私有,则客户端将会感到困惑。