【问题标题】:How do I access privately inherited class members in C++?如何在 C++ 中访问私有继承的类成员?
【发布时间】:2018-09-17 08:44:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可能对this thread感兴趣。
  • “我看到他们写的所有地方”谁?我从未见过这样的说法。请引用您正在阅读的内容。
  • “这不是让它有点没用吗?” - 不。仍然可以通过调用使用它的父类的方法来使用该成员。从本质上讲,这表示“此成员用于任何子类都不会触及的功能”。

标签: c++ oop inheritance private-inheritance


【解决方案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 继承自 foo 确实有意义,因为它使用了它的功能。

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      另一种表述方式是“我们想使用这个类的实现,但忽略它的接口”。

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

      【讨论】:

        猜你喜欢
        • 2012-01-04
        • 2017-03-16
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 2020-09-01
        • 1970-01-01
        • 2016-01-28
        相关资源
        最近更新 更多