继承的理解

C++继承的理解

  • 1.继承的概念
    • 1.简单的来说就是对基类当中的成员变量和成员函数的一种继承,在派生类当中也可以继续使用

    • 2.通过继承的访问限定符,可以限制基类中的内容不让派生类来使用

    • 3.前面所使用的复用是在函数层面进行的复用,继承是在类的层面进行的复用

    • 4.基类当中的private的内容同样也继承到派生类中,但是派生类不能够访问该内容
      在这里插入图片描述

  • 2.基类与派生类之间赋值
    class person
    {
        protected:
        std::string school = "MIT";
    };
    class master:public person
    {
        public:
        void print()
        {
            std::cout << "information:" <<person::school<<"_"<<name
                <<"_"<<gender<<"_"<<age << std::endl;
        }
        protected:
        std::string name = "Jolly.Roger";
        std::string gender = "male";
        size_t age = 24;
    };
    int main()
    {
        //可以进行
        master m1;
        person p1=m1;
        person* p2=&m1;
        person& p3=m1;
        //基类指针强制类型赋值给派生类
        master& m2=(master*)p2
            
        //不可以进行
        person p3;
        m1=p3;
        master& m4=p3;
        
        return 0;
    }
    
    • 派生类里面的东西(值,指针,引用)可以赋值给基类(这里的赋值是语法天然支持的)
    • 基类里面的东西(值,引用)不可以赋值给派生类,但是基类的指针可以通过强制类型转换赋值给派生类
    • 为了方便理解和记忆,可以想象成基类的内容少,派生类的内容多,少的不能给多,但是多的可以给少的,多余部分不要
  • 3.继承当中的作用域
    • 两者都有其独立的作用域,派生类里面由与基类同名的成员变量时,派生类将优先屏蔽基类当中的成员变量,想要访问时使用基类名::成员变量
    • 基类与派生类有相同的成员函数名时,派生类同样对其进行隐藏
  • 4.继承当中的构造函数
    • 在派生类里面,如果调用的是基类的成员变量,将会使用基类里面构造函数
    • 在派生类里面,如果调用的是派生类的成员变量,将会使用派生类里面构造函数
    • 如果基类没有默认的构造函数,则要派生类构造函数的初始化列表阶段显示调用
  • 5.继承当中的友元
    • 友元关系不能够继承,也就是说基类友元不能够访问子类私有和保护成员
  • 6.继承当中的静态函数
    • 如果在基类里面定义了一个静态变量,则该继承体系里面该成员变量就只有一个,无论派生出多少个类,都只有这一个

      class person
      {
          public:
          person()
          {
              ++num;
          }
          protected:
          std::string school = "MIT";
          public:
          static int num;
      };
      int person::num = 0;
      class master:public person
      {
          public:
          void print()
          {
              std::cout << "information:" <<person::school<<"_"<<name
                  <<"_"<<gender<<"_"<<age << std::endl;
          }
          protected:
          std::string name = "Jolly.Roger";
          std::string gender = "male";
          size_t age = 24;
      };
      
      Lp700::master m1;
      Lp700::master m2;
      Lp700::master m3;
      std::cout << Lp700::person::num << std::endl;
      Lp700::master::num = 0;
      std::cout << Lp700::person::num << std::endl;
      
      输出结果:3 0
      
  • 7.继承当中的虚拟继承
    • 为什么会存在虚拟继承呢?

      • 因为继承中存在多继承->多继承当中会存在由菱形继承->菱形继承会出现数据的二义性和数据冗余

        在这里插入图片描述

    • 什么是虚拟继承?

      • 就是在正常的继承前面加上一个关键字virtual
    • 虚拟继承的原理是什么?

      未使用虚拟继承

      在这里插入图片描述

      使用虚拟继承

在这里插入图片描述

  • 1.使用了虚拟继承之后,A类里面的成员不会在每一个继承体系里都有一份,而是单独放了一份,每一个继承体系通过虚基表指针找到相对偏移量,每一个继承体系通过相对偏移量来查找A这个基类里面得到成员,这样可以有效的避免数据的二义性和数据的冗余。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值