为了账号安全,请及时绑定邮箱和手机立即绑定

私有继承、公共继承和保护继承之间的区别

私有继承、公共继承和保护继承之间的区别

手掌心 2019-06-01 14:46:06
私有继承、公共继承和保护继承之间的区别.之间的区别是什么?public, private,和protectedC+中的继承?我发现的所有问题都是针对具体案件的。
查看完整描述

4 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

为了回答这个问题,我想先用我自己的话来描述成员的访问器。如果您已经知道这一点,请跳到标题“Next:”。

我知道有三个访问器:publicprotectedprivate.

让:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;};
  • 所有意识到的

    Base

    也意识到

    Base

    publicMember.

  • 只有孩子(和他们的孩子)知道

    Base

    protectedMember.

  • 除了

    Base

    意识到

    privateMember.

所谓“意识到”,我的意思是“承认存在,从而能够访问”。

下一步:

公共、私有和受保护的继承也是如此。让我们考虑一个类Base和一堂课Child继承自Base.

  • 如果继承是

    public

    ,意识到的一切

    Base

    Child

    也意识到

    Child

    继承自

    Base.

  • 如果继承是

    protected

    ,只有

    Child

    ,以及它的孩子们,都知道他们是从

    Base.

  • 如果继承是

    private

    ,除了

    Child

    意识到了遗传。


查看完整回答
反对 回复 2019-06-01
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

限制继承的可见性将使代码无法看到某些类继承了另一个类:从派生类到基类的隐式转换将无法工作,并且static_cast从基到派生也不起作用。

只有类的成员/朋友才能看到私有继承,只有成员/朋友和派生类才能看到受保护的继承。

公众继承

  1. 是-遗产。按钮是一个窗口,在任何需要窗口的地方,也可以传递一个按钮。

    class button : public window { };

受保护继承

  1. 受保护-实施-条件。很少有用。用于boost::compressed_pair若要从空类派生并使用空基类优化来节省内存(例如,下面的示例不使用模板来保持当前状态):

    struct empty_pair_impl : protected empty_class_1 
    { non_empty_class_2 second; };struct pair : private empty_pair_impl {
      non_empty_class_2 &second() {
        return this->second;
      }
    
      empty_class_1 &first() {
        return *this; // notice we return *this!
      }};

继承

  1. 已实施-在-条件下。基类的使用仅用于实现派生类。对特征有用,如果大小重要(只包含函数的空特征将使用空基类优化)。经常安全壳不过,这是更好的解决办法。字符串的大小是非常重要的,所以这里经常使用它

    template<typename StorageModel>struct string : private StorageModel {public:
      void realloc() {
        // uses inherited function
        StorageModel::realloc();
      }};

公众成员

  1. 骨料

    class pair {public:
      First first;
      Second second;};
  2. 存取器

    class window {public:
        int getWidth() const;};

受保护成员

  1. 为派生类提供更好的访问

    class stack {protected:
      vector<element> c;};class window {protected:
      void registerClass(window_descriptor w);};

成员

  1. 保留实现细节

    class window {private:
      int width;};

请注意,C风格的强制转换允许以一种定义和安全的方式将派生类强制转换到受保护的或私有的基类,并将其转换到另一个方向。应该不惜一切代价避免这种情况,因为它可以使代码依赖于实现细节-但如果有必要,您可以使用这种技术。


查看完整回答
反对 回复 2019-06-01
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

它与基类的公共成员如何从派生类中公开有关。

  • >基类的公共成员将是公共的(通常是默认的)
  • 受保护的->基类的公共成员将受到保护
  • >基类的公共成员将是私有的

正如litb所指出的,公共继承是传统的继承,您将在大多数编程语言中看到这一点。那就是它塑造了一种“是-A”的关系。私有继承,是C+特有的AFAIK,是一种“在关系中实现的”关系。那就是你想使用派生类中的公共接口,但不希望派生类的用户访问该接口。许多人认为,在这种情况下,您应该聚合基类,而不是将基类作为私有基类,而是在派生的成员中进行聚合,以便重用基类的功能。


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 724 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信