C++之继承和派生

2021-06-06 09:04

阅读:351

标签:二义性   位置   强制   概念   void   析构函数   覆盖   虚继承   无法   

继承

  • 继承和派生是相对的,继承指的是子类(派生类)继承父类(基类)。派生指的是父类(基类)传承自己的 "家业"给子类(派生类)
  • 三种方式(指的是权限public,protected,private)对继承自基类内容的权限只能小于等于继承方式
  • 覆盖问题,子类同名函数或者变量会覆盖父类,不存在重载方式。如果想访问父类的被覆盖内容,需要加 域解析符
  • 继承时,变量在内存中按照基类->子类->声明顺序在内存中增长存储
  • 产生二义性的时候,要加域解析符

构造函数

  • 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许
  • 无法继承,构造函数初始化顺序和基类的声明定义顺序有关,和初始化列表的位置无关
  • 在子类构造函数初始化时,只能调用直接基类的构造函数,不能调用间接基类的。防止重复初始化
  • 执行顺序,先执行基类的,再执行子类

析构函数

  • 析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。
  • 无法继承,与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉
  • 执行顺序,先执行子类的,再执行基类的,即后构造的先析构

虚继承

  • 为了解决多继承(菱形继承)成员变量存在多分拷贝的问题(会发生二义性以及命名冲突等问题)
  • 继承时加上virtual关键字即为虚继承,被虚继承的基类将共享成员(这对被继承的基类没有影响)
  • 虚继承在VC中还引入了"虚表"概念,虚表就是一个数组,维护了一些基类的相对于当前对象的地址偏移
  • 虚基类的对象成员总是被放在内存模型的最后,有共享特性

转换(对象,指针,引用)

  • 子类向父类转换(向上转换)无需额外操作
  • 父类向子类强制转换(危险)需要手动操作(dynamic_cast关键字),参考类型截断

C++之继承和派生

标签:二义性   位置   强制   概念   void   析构函数   覆盖   虚继承   无法   

原文地址:https://www.cnblogs.com/ming-fei/p/14612842.html


评论


亲,登录后才可以留言!