继承和多态2

1.多态:

多态分为静多态动多态
静多态——在编译时期产生——又被称为早绑定;
代表:函数重载 , 模板。

动多态——运行时期的多态——有被称为晚绑定;
代表:继承中的多态。

什么是函数重载? 函数名相同,参数列表不同,作用域相同。

为什么c语言没有重载,C++有重载?

因为c语言产生的函数符号只依赖于函数名,
c++产生的函数符号依赖于函数名+参数列表。(函数名不同,参数列表不同,生成的符号不同)

2.隐藏

子类中的成员会隐藏父类中同名的成员。

3.覆盖重写

子类中的成员方法会覆盖父类中相同(同返回值,同函数名,同参数列表)的虚函数。

4.动多态的产生条件

指针或引用调用虚函数, +对象必须完整;
完整对象:构造函数执行完毕,析构函数还未开始;

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

6.vftable什么时候产生?在那里存储?

编译时期,放在.rodata段

7.构造函数能不能写成虚函数?

不能 ,
构造函数无法通过指针或者引用调用,所以写成虚函数没有意义;
vfptr是在构造的时候写入对象,而多态调用虚函数需要用到虚函数;

8.静态函数能不能写成虚函数?

不能,静态函数不依赖于对象,无法产生动多态;

9.析构函数能不能写成虚函数?

10.虚函数能不能被处理成内联?

不能, 虚函数需要将函数指针放到vftable, 而内联函数在编译期会展开;
在release版本没有地址;

11.什么情况下析构函数必须写成虚函数?

当存在父类指针指向堆上的子类对象的时候,就必须把父类的析构函数写成虚函数;

12.父类指针指向子类对象,究竟指向子类对象的哪个位置?

指向父类空间开始的地方;

父类指针指向堆上的子类的对象时候,一定要确保父类的析构函数是虚函数;

父类没有虚函数子类有虚函数的情况:
在这里插入图片描述

父类和子类都有虚函数的时候:
在这里插入图片描述

父类和子类都指向子类覆盖的vfptr

13.父类指针能不能指向子类对象?子类指针能不能指向父类对象?


不能

14.类的编译顺序?

先编译类名;
再编译成员名;
成员函数体。

15.父子类/组合类的构造顺序?

父子类:
构造先构造父类再构造子类;
析构先析构子类再析构父类;
组合类:
构造先构造里面的再构造外面的;
析构先析构外面的再析构里面的;

16.什么是RTTI,RTTI在什么时候产生?RTTI信息存储再哪里?

在这里插入图片描述

RTTI是运行时期的类型信息,是一个指向类型信息的指针;
编译时期产生,RTTI指针放在vftable里面;
类型信息放在.rodata段。

17.父类指针如何转化为子类指针?转化有什么条件?

dynamic_cast 父类指针转为子类指针专用的类型强转;
要求:
1.必须有RTTI ;
2.父类指针指向的对象中的RTTI确实是子类的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值