如何在C ++中访问私有继承的类成员?

时间:2018-09-17 08:44:03

标签: c++ oop inheritance private-inheritance

我试图理解私有继承的概念。

到目前为止,我到处都看到他们写道私有继承使派生类无法访问其成员。

这不是使它变得无用吗?如果我无法访问继承的类,那么首先派生的目的是什么?

现在,我知道私有类实际上已经使用并且很有帮助。我只是在理解方式上遇到了麻烦。

3 个答案:

答案 0 :(得分:0)

确实很难获得私有继承,但是有时您确实希望类的用户无法访问基类的成员。

例如,我将Boost(www.boost.org)用于日期类,但我不希望将其暴露给日期类的用户,因为有一天我可能想将Boost转换为其他内容。

答案 1 :(得分:0)

您的问题看起来好像 [1] "SLIM SSD POWER ADAPTER" "8.4L 1ST 3.5 HDD POWER ADAPTER" "SATA POWER ADAPTER FOR ODD/2HDD" [4] "SLIM SSD SATA&POWER ADAPTER" "SATA POWER ADAPTER FOR HDD" "2ND 3.5 HDD+SSD POWER ADAPTER" [7] "SATA POWER ADAPTER" "1ND 3.5 HDD+SSD POWER ADAPTER" "DUAL NET CARD SATA POWER ADAPTER" [10] "POWER ADAPTER (Others)" 个成员完全没有用。我的意思是,您最好问一下,如果无法从外部访问私有成员,那有什么用呢?但是,一个类(通常)比子类可以使用的更多。

考虑以下简单示例:

private

struct foo { void print(); }; struct bar : private foo { void print_bar() { std::cout << " blablabla \n"; print(); std::cout << " bblablabla \n"; } }; 继承的类甚至不会注意到barbar继承。不过,foobar继承确实很有意义,因为它使用了它的功能。

请注意,私有继承实际上更接近于构成而不是公共继承,而上面的情况也可能是

foo
  

如何在C ++中访问私有继承的类成员?

在课程之外:您没有,这就是struct bar { foo f; void print_bar() { std::cout << " blablabla \n"; print(); std::cout << " bblablabla \n"; } }; 的用途。通常,私有成员或私有方法没有什么不同,它们在那里是有原因的,您只是无法从外部访问它们。

答案 2 :(得分:0)

私有继承是一种建模“具有”关系的方法。建模的通常替代方法是合成,应尽可能使用它。当涉及一个类的受保护成员时,私有继承对于建模has-a关系很有用。

一种不同的框架方式是“我们想使用此类的实现,但忽略其接口”。

(我对此的经验是有限的,这是我从Scotty Meyers Effective C ++回忆起的,因为从来没有出现过我宁愿使用私有继承而不是合成的情况)