C++中的继承问题

继承
  • 基本语法
    • class 子类:继承方式 父类
      class Base{
    
      };
      class New:public Base{
    
      }
    
  • 继承方式
    • 公有继承
      • 父类中的public和protected在子类中性质不变继承,private子类不可继承
    • 保护继承
      • 父类中的public和protected均变为子类中的protected,private子类不可继承
    • 私有继承
      • 父类中的public和protected均变为子类中的private,private子类不可继承
    • 我们要注意虽然子类的private不可以在子类中再次调用使用,但是其依然存在占用sizeof
  • 继承中构造和析构顺序
    • 先base构造后son构造
    • 先son析构后son析构
  • 继承同名成员的处理方式
    • 问题
      • 当子类和父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢
    • 访问子类同名成员 直接访问即可
    • 访问父类同名成员 需要加作用域
    • 如果子类中出现和父类同名的成员函数,子类的同名成员函数会隐藏掉父类中所有同名成员函数
      class Base{
          public:      
          int num;
          Base(){
              num = 10;
          }
          void func(void){
              cout << "Base-func" << endl;
          }
          void func1(void){
              cout << "Base-func1" << endl;
          }
      };
      class Son:public Base{
          public:
          Son(){
              num = 20;
          }
          void func(void){
              cout << "Son-func" << endl;
          }
          void func1(void){
              cout << "Son-func1" << endl;
          }
      };
      void test01(void){
          Son s;
          cout << s.num << endl;
          cout << s.Base::num << endl;
          s.func();
          s.Base::func();
      }
    
  • 继承同名静态成员处理方式
    • 继承中同名的静态成员在子类对象上如何进行访问
    • 静态成员和非静态成员同名,处理方式一致就如上所示加入作用域
    • 静态成员其实直接通过类访问,不一定非要对象
    • 解释 Son::Base::m_A的意义
      • 第一个代表通过类访问方式直接访问静态成员
      • 第二个代表父类的作用域下
  • 多继承语法
    • 语法
      • class 子类:继承方式 父类1, 继承方式 父类2…{}
    • 多继承可能会引发父类中有同名成员出现,需要加作用域区分
  • 菱形继承
    • 两个派生类继承同一个基类
    • 又有某个类同时继承两个派生类
    • 这种继承被称为菱形继承
    • 解决
      • 虚继承—在继承之前加上关键字virtual编程虚继承—被继承最大的类叫虚基类
      • 虚继承本质上将数值继承改变成为了指针访问基类对应位置,这样内存开辟其实只是一个特定的区域,而访问时通过指针偏移进行的(vbptr)
      class Animal{
          public:
              int age;
      }
      class Sheep:virtual public Animal{};
      class Tuo:virtual public Animal{};
      class SheepTuo:public Sheep, public Tuo{};
      void test(){
          SheepTuo st;
          st.Sheep::age = 100;
          st.Tuo::age = 200;
          cout << st.Sheep::age << endl;
          cout << st.Tuo::age << endl;   
          cout << st.age << endl;   
      }
    
    • 以上代码均输出200,本质上就是继承了虚指针,指向同一片区域
    • 有效解决了资源浪费的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值