【C++】7.多态

本文深入探讨了面向对象编程的三大特性——继承、多态和抽象。详细阐述了编译时多态与运行时多态的区别,并通过实例说明了如何在C++中实现。同时,解释了多态如何遵循开闭原则,使得代码更具扩展性。此外,还介绍了抽象类和纯虚函数的概念,强调了虚析构函数在资源管理中的重要性,以及类型转换中的向上和向下转换注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 基本概念

  1. 面向对象的三大特性:继承,多态,抽象
  2. 多态性提供Interface与Impl之间的另一层隔离,从而将what与how分离开来.使得程序具有可扩展性.
  3. c++支持编译时多态(静态多态)和运行时多态(动态多态):
    1. 编译时多态:运算符重载,函数重载
    2. 运行时多态:派生类,虚函数
    3. 两者的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编).
      1. 如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态) ,就是说地址是早绑定的。
      2. 而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这就属于晚绑定(动态多态,运行时多态)。

2.多态

开闭原则:对扩展开放,对修改关闭
  1. 写法:父类的引用或指针指向子类对象
Animal * a;//父类的引用
a=new Cat;//指向子类对象

![[Pasted image 20221015155726.png]]

  1. 当父类中有了虚函数后,内部结构就发生了改变.父类中会多vfptr这个指针指向虚函数表.
  2. 子类中会继承vfptr指向vftable.对象创造时构造函数会将虚函数指针指向自己的虚函数表.
  3. 如果发生了重写,会替换掉虚函数中原有的父类方法,改为子类的方法

3.抽象类和纯虚函数

  1. 纯虚函数是将父类中的没有实现体的虚函数直接写为:virtual int getResult()=0;
  2. 子类继承父类的纯虚函数,必须写实现体,否则由抽象类派生的类也是一个抽象类.
  3. 如果父类中有了纯虚函数,那这个父类就无法实例化对象了!这时的父类就叫抽象类.
  4. 抽象类无法实例化对象.

4.虚析构和纯虚析构

普通析构不会调用子类的虚构,导致释放不干净,应该利用虚析构.
  1. 写法:virtual ~Animal(){}
  2. 若没有实现,使用纯虚析构:
virtual ~Animal()=0;//在父类里,要在父类外写实现

Animal::~Animal(){//在父类外
	//纯虚析构的实现
}
  1. 拥有纯虚析构的类也是抽象类,不能实例化.

5. 类型转换

基类开辟的指针空间小,派生类开辟的指针空间会比基类大!

(1)向上类型转换

Animal *animal=new Cat;->派生类转向基类(多态),安全.

(2)向下类型转换

Cat *cat=new Animal;->基类转向派生类,不安全.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值