C++中的面向对象06.多态

多态(polymorphism):多种状态,在面向对象编程中,调用不同对象的同种方法会产生不同的行为。
多态是通过虚函数实现的。
虚函数:用virtual关键字修饰的方法。
如果父类中某个方法为虚函数,那么子类中的该方法也自动为虚函数,可以不用加virtual关键字,但为了增加可读性,建议加上virtual关键字修饰。
如果子类重新实现了父类中的某个虚函数,我们称为子类了重写了(overwrite,override)该方法。
如果子类重新实现了父类中的某个非虚函数,我们称为同名覆盖。(虚函数的同名覆盖就是重写)
虚函数只是继承了原函数的指针,没有新的形成,非虚则是拷贝了一份。

多态机制:将子类对象的指针赋给父类指针变量,或将子类对象赋给父类引用,通过父类指针或引用去调用父类中的某个虚函数,如果子类重写了该虚函数,那么调用的将是子类中的虚函数,否则将调用父类中的虚函数。

纯虚函数(Pure Virtual Function)和抽象类(Abstract Class)
纯虚函数:只有声明没有实现的虚函数,并且要在声明部分的后面添加“= 0”
抽象类:含有纯虚函数的类
抽象类不能被实例化,即通过抽象类不能定义任意对象,抽象类通常是用来作为其他类的父类使用的,即抽象基类。
如果一个抽象类的子类不重写其父类中的所有纯虚函数,那么该子类也是抽象类,不能用来定义对象,反之它将是一个具体类(concrete class),可以用来定义对象。

虚析构函数(virtual destructor)
在堆区中定义一个子类对象,然后将其指针赋给父类指针变量,最后通过父类指针去释放该子类对象时,
如果父类的析构函数不是析构函数,那么只会调用父类的析构函数,而子类的析构函数不会被调用,可能会导致内存泄露,
如果父类的析构函数为虚函数,那么首先会调用子类的析构函数,然后再调用父类的析构函数。
C++编码规范:在定义一个类时,将他的析构函数定义为虚函数

虚函数表(V-table,vftable):C++多态机制是通过虚函数实现的
如果一个类中含有虚函数,那么该类会对应虚函数表,用于存放各个虚函数的指针,该类的所有对象所占存储空间的开始四个字节都是指向这个表头的指针
表中的存放各个虚函数方法的指针

子类不重写相当于只是拷贝了一份
重写了方法对应的虚函数表的指针会变(指向重定义的方法)

虚继承是通过虚基表(vbtable)实现的

转载于:https://my.oschina.net/HappyTeemo/blog/1558501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值