C++继承和多态总结

继承
  • 继承:在已有类的基础上创建新类的过程
  • 一个 B 类继承A类,或称从类 A 派生类 B
    类 A 称为基类(父类),类 B 称为派生类(子类)
多继承方式下构造函数的执行顺序:

先执行所有基类的构造函数
在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。

  • 再执行对象成员的构造函数
    通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
  • 最后执行派生类的构造函数
    仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。
派生类构造函数和析构函数的使用原则
  1. 基类的构造函数和析构函数不能被继承
  2. 如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数
  3. 如果基类无无参的构造函数,派生类必须定义构造函数
  4. 如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
  5. 派生类是否定义析构函数与所属的基类无关
派生类析构函数

(1)当派生类中不含对象成员时

  • 在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
  • 在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。

(2)当派生类中含有对象成员时

  • 在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
  • 在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。
多继承方式下构造函数的执行顺序
  • 先执行所有基类的构造函数
  • 再执行对象成员的构造函数
  • 最后执行派生类的构造函数
虚基类
  • 如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性。
  • 如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象。
  • 要使这个公共基类在派生类中只产生一个子对象,必须对这个基类声明为虚继承,使这个基类成为虚基类。
    虚继承声明使用关键字 virtual
赋值兼容规则
  • 赋值兼容规则指在程序中需要使用基类对象的任何地方,都可以用公有派生类的对象来替代。
  • 赋值兼容规则中所指的替代包括以下的情况:
    a 派生类的对象可以赋给基类对象
    b 派生类的对象可以初始化基类的引用
    c 派生类的对象的地址可以赋给基类类型的指针
多态性
  • 多态性(Polymorphism)是指一个名字,多种语义;或界面相同,多种实现。
  • 重载函数是多态性的一种简单形式。
  • 虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编。
多态的实现
  • 多态性的实现和联编这一概念有关。所谓联编(Binding,绑定)就是把函数名与函数体的程序代码连接(联系)在一起的过程。

联编分成两大类:静态联编动态联编
静态联编优点:调用速度快,效率高,但缺乏灵活性;动态联编优点:运行效率低,但增强了程序灵活性。
C++为了兼容C语言仍然是编译型的,采用静态联编。为了实现多态性,利用虚函数机制,可部分地采用动态联编。
多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。
编译时的多态是通过静态联编来实现的。静态联编就是在编译阶段完成的联编。编译时多态性主要是通过函数重载和运算符重载实现的。
运行时的多态是用动态联编实现的。动态联编是运行阶段完成的联编。运行时多态性主要是通过虚函数来实现的。

静态联编
  • 联编是指一个程序模块、代码之间互相关联的过程。

  • 静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配。

  • 重载函数使用静态联编。
    动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编。
    switch 语句和 if 语句是动态联编的例子。

  • 在一个类说明中重载

  • 基类的成员函数在派生类重载。有 3 种编译区分方法:
    (1)根据参数的特征加以区分
    (2)使用“ :: ”加以区分
    (3)根据类对象加以区分

类指针的关系

基类指针和派生类指针与基类对象和派生类对象4种可能匹配:

  1. 直接用基类指针引用基类对象;
  2. 直接用派生类指针引
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的继承多态和虚函数是面向对象编程的重要概念。 继承是指一个类可以从另一个类继承属性和方法。子类可以继承父类的公有成员和保护成员,但不能继承私有成员。通过继承,子类可以重用父类的代码,并且可以添加自己的特定功能。继承可以实现代码的重用和层次化的设计。 多态是指同一个函数可以根据不同的对象调用不同的实现。多态可以通过虚函数来实现。虚函数是在基类中声明为虚拟的函数,它可以在派生类中被重写。当通过基类指针或引用调用虚函数时,实际调用的是派生类中的实现。这样可以实现动态绑定,即在运行时确定调用的函数。 虚函数的原理是通过虚函数表来实现的。每个包含虚函数的类都有一个虚函数表,其中存储了虚函数的地址。当调用虚函数时,编译器会根据对象的类型在虚函数表中查找对应的函数地址并调用。 综上所述,C++中的继承多态和虚函数是实现面向对象编程的重要机制,它们可以提高代码的灵活性和可扩展性。 #### 引用[.reference_title] - *1* *3* [C++多态之 虚函数和虚函数表](https://blog.csdn.net/weixin_46053588/article/details/121231465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [c++多态及虚函数表内部原理实战详解](https://blog.csdn.net/bitcarmanlee/article/details/124830241)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值