2010-09-02 124 views
5

我想做的事情做在一个基类中的公共成员在派生类中私有的,就像这样:我可以在派生类中创建一个公共成员变量private吗?

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

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

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

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

+1

这感觉就像一个笨拙的设计。即使你可以为B类做这件事,所有人需要做的事情都是上传到A的指针或引用,然后他们将能够访问该成员。 – TheUndeadFish 2010-09-02 02:38:46

+1

的可能的复制[C++:如何将公开从基类继承,但做了一些从基类派生类中的私有公有方法?(http://stackoverflow.com/questions/2986891/c-how-to -publicly - 继承 - 从-A-基类,但是,化妆一些-的公共的方法-FR) – 2010-09-02 04:26:15

回答

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 
}; 
3

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

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

但是请认真评估,如果这样做有设计感。

几点意见:

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

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

相关问题