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

How do I access privately inherited class members in C++?

我正在尝试理解私有继承的概念。

到目前为止,我到处都看到他们写道,私有继承使其成员无法从派生 class.

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

现在我知道私有 classes 确实有用而且有用。我只是无法理解如何做。

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

例如,我将 Boost (www.boost.org) 用于我的约会 class,但我不希望它暴露给我约会 class 的用户,因为有一天我可能想要换掉 Boost 以换取其他东西。

你的问题看起来好像 private 成员完全没有用。我的意思是你也可以问,如果不能从外部访问私有成员,它有什么用。但是,class(通常)比 subclass 可以使用的更多。

考虑这个简单的例子:

struct foo {
    void print(); 
};

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

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

注意私有继承其实更接近组合而不是public继承,上面也可以是

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

How do I access privately inherited class members in C++?

class 之外:你不知道,这就是 private 的用途。一般而言,私有成员或私有方法并没有什么不同,它们存在是有原因的,您只是无法从外部访问它们。

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

另一种构图方式是"we want to use the implementation of this class, but ignore its interface"。

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