私人,公共和受保护继承的区别

C ++中publicprivateprotected继承之间的区别是什么? 我在SO上发现的所有问题都涉及特定案例。


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

我知道有三种访问者: publicprotectedprivate

让:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};
  • 所有知道Base都知道Base包含publicMember
  • 只有孩子(和他们的孩子)知道Base包含protectedMember
  • Base没有人知道privateMember
  • 通过“意识到”,我的意思是“承认存在并因此能够存取”。

    下一个:

    公共,私有和受保护的继承也是如此。 让我们考虑一个类Base和一个从Base继承的类Child

  • 如果继承是public ,那么知道BaseChild都会意识到ChildBase继承。
  • 如果继承是protected ,则只有Child及其子节点知道它们继承自Base
  • 如果继承是privateChild以外的任何人都不知道继承。

  • class A 
    {
    public:
        int x;
    protected:
        int y;
    private:
        int z;
    };
    
    class B : public A
    {
        // x is public
        // y is protected
        // z is not accessible from B
    };
    
    class C : protected A
    {
        // x is protected
        // y is protected
        // z is not accessible from C
    };
    
    class D : private A    // 'private' is default for classes
    {
        // x is private
        // y is private
        // z is not accessible from D
    };
    

    重要提示:类B,C和D都包含变量x,y和z。 这只是访问的问题。

    关于保护和私有继承的使用,你可以在这里阅读。


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

    只有成员/朋友可以看到私有继承,并且只有成员/朋友和派生类可以看到受保护的继承。

    公共继承

  • IS-A继承。 一个按钮是一个窗口,并且在需要窗口的任何地方,按钮也可以被传递。

    class button : public window { };
    
  • 受保护的继承

  • 受保护的实施条款。 很少用。 在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!
      }
    };
    
  • 私人继承

  • 实现合条件方面。 基类的用法仅用于实现派生类。 对于特征和大小很重要(只包含函数的空特征将利用空基类优化)非常有用。 不过,通常遏制是更好的解决方案。 字符串的大小很重要,所以这是一个常见的用法

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

  • 公众成员

  • 骨料

    class pair {
    public:
      First first;
      Second second;
    };
    
  • 访问器

    class window {
    public:
        int getWidth() const;
    };
    
  • 保护成员

  • 为派生类提供增强的访问权限

    class stack {
    protected:
      vector<element> c;
    };
    
    class window {
    protected:
      void registerClass(window_descriptor w);
    };
    
  • 私人会员

  • 保持实施细节

    class window {
    private:
      int width;
    };
    

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

    链接地址: http://www.djcxy.com/p/2215.html

    上一篇: Difference between private, public, and protected inheritance

    下一篇: What is Dynamic Memory Allocation in C++?