-2

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

到目前为止,我所看到的所有地方都写道,私有继承使得派生类无法访问其成员。

这不是让它有点没用吗?如果我无法访问继承的类,那么首先派生的目的是什么?

现在我知道私人课程实际上是有用的并且很有帮助。我只是很难理解如何。

4

3 回答 3

1

您的问题看起来好像private成员完全没用。我的意思是你也可以问,如果不能从外部访问私有成员有什么好处。然而,一个类(通常)比一个子类可以使用的要多。

考虑这个简单的例子:

struct foo {
    void print(); 
};

struct bar : private foo {
    void print_bar() {
        std::cout << " blablabla \n";
        print();
        std::cout << " bblablabla \n";
    }
};

继承自的类bar甚至不会注意到bar继承自foo. bar尽管如此,继承 from确实有意义foo,因为它使用了它的功能。

请注意,私有继承实际上更接近于组合而不是公共继承,上面也可以是

struct bar { 
    foo f;
    void print_bar() {
        std::cout << " blablabla \n";
        print();
        std::cout << " bblablabla \n";
    }
};

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

课外:你不知道,这就是private目的。一般来说,私有成员或私有方法并没有什么不同,它们的存在是有原因的,你只是不能从外部访问它们。

于 2018-09-17T09:14:29.380 回答
0

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

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

(我在这方面的经验是有限的,这是我从 Scotty Meyers Effective C++ 中回忆的,因为从来没有出现过我更喜欢私有继承而不是组合的情况)

于 2018-09-17T11:21:46.380 回答
0

确实很少需要私有继承,但有时您确实希望您的类的用户无法访问基类的成员。

例如,我将 Boost (www.boost.org) 用于我的日期类,但我不希望它暴露给我的日期类的用户,因为有一天我可能想将 Boost 换成别的东西。

于 2018-09-17T08:59:18.913 回答