C++:多态

11_11多态

1.多态
静多态和动多态
静多态:编译时期的多态,被称为早绑定地址
动多态:运行时期的多态,又被称为晚绑定地址
例子:继承中的多态,重载,模板
隐藏:子类中的成员会隐藏父类中同名的成员。
覆盖:父类中对应的相同函数(同返回值,同函数名,同参数列表)会被传递为虚函数

2.动多态产生条件
使用指针或者引用调用虚函数就会产生动多态,对象必须完整
完整对象:构造函数执行完毕,析构函数还未开始

3.动多态的过程
动多态调用过程:
(1)使用指针或者引用调用虚函数
(2)在对象中找到vfptr
(3)根据vfptr找到vftable
(4)在vftable中找到要调用的函数
(5)调用

4.Vftable什么时候产生?在哪里存储?
编译时期,rodata段,只读数据段

5.虚函数产生
(1)构造函数能不能写成虚函数?
不能,因为构造函数无法通过指针或者引用调用,所以写成虚函数没有意义,vfptr构造时期写入对象,而多态调用虚函数需要用到vfptr,所以两者矛盾。
(2)静态函数能不能写成虚函数?
不能,静态函数不依赖于对象,不依赖于指针进行调用。无法产生动多态,因为this指针。
(3)析构函数能不能产生虚函数?

(4)虚函数能不能被处理成内联?
不能,因为虚函数需要将函数指针放到vftable中,而内联函数在编译期展开,在release版本没有地址。

6.什么情况下析构函数必须写成虚函数?
父类没有虚函数,子类有虚函数,当存在父类指针指向堆上的子类对象时候,指向父类空间开始的地方,父类指向堆上的时候,一定要确保父类中有虚函数,才能保证产生动多态,父类的析构函数是虚函数,就必须把父类的析构函数写成虚函数。
当父类和子类都有析构函数,父类有vfptr

7.父类指针能不能指向子类对象?子类指针能不能指向父类对象?
可以,指向父类空间开始的地方,四字节的vfptr;
不能

8.父子类/组合类的构造顺序
先构造父类,后构造子类,先析构子类,后析构父类
先构造里面的成员对象,在构造外面的,先析构外面的,在析构里面的

9.类的编译顺序
先编译类名,再编译成员名,最后编译成员函数体

10.什么是RTTI(run time type info)?RTTI什么时候产生?RTTI信息存储在哪里?
运行时期的类型信息,是一个指向类型信息的指针,编译时期产生,RTTI指针放在vftable中,类型信息存储在只读数据段(.rodata)。
Dynamic_cast 父类指针转为子类指针专用类型强传
在这里插入图片描述
这种强转会去RTTI中查看当前p指针指向的是否是derive*目标类型
要求:(1)必须有RTTI(2)父类指针指向的对象中的RTTI确实是子类的。

11.父类指针如何转换成子类指针?转化有什么条件?
用dynamic_cast转换,用RTTI转化
要求:(1)必须有RTTI(2)父类指针指向的对象中的RTTI确实是子类的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值