继承与多态篇

oop语言的三大特性:封装与隐藏、继承、多态。
1、继承
继承的意义在于代码的复用,除了基类的构造函数和析构函数外,派生类会继承基类的所有成员方法与成员变量,但成员方法不占用内存。
所以在计算sizeof时,一定要把基类成员变量的内存加上。

这里写图片描述

2、关于基类成员变量的访问限定
这里写图片描述
3、派生类对象的构造方式
先构造基类对象,在构造派生类对象,析构时先析构派生类对象,在析构基类对象。

4、基类和派生类成员方法之间的关系
重载
1、在同一个作用域中;
2、函数名相同,参数列表不同,可以构成函数重载
3、用const/volatile修饰&或者*时能构成重载。
隐藏:在基类与派生类的继承关系中,返回值,函数名相同,参数列表相同,基类中的成员方法会被隐藏,所以在调用基类的同名函数时必须加基类作用域
覆盖:在基类与派生类的继承关系中,基类成员方法返回值,函数名,参数列表都相同,并且是vitural的(派生类不用写vitural也是vitural函数哦),就能构成覆盖,重写基类在派生类中的方法。

5、派生类不支持从上到下的转换,只支持从下(派生类)到上(基类)的转换。
派生类对象 = 基类对象 flase
基类对象 = 派生类对象 true
基类指针 = 派生类对象 true
派生类指针 = 基类对象 flase

6、C++的4种类型强转
const_cast 转换符是用来移除变量的const或volatile限定符
static_cast 非多态的转换,用于代替C中通常的转换操作,被作为显示类型转换
reinterpet_cast 将数据从一种类型的转换为另一种类型
dynamic_cast 将一个基类对象指针(或引用)cast到继承类指针

7、虚函数表
编译器为有虚函数的类产生一张虚函数表,这张虚表被该类的所有对象共享,类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4字节的大小。在有虚函数的类的实例中分配了指向这个表的指针的内存,所以,当用父类的指针来操作一个子类的时候,这张虚函数表就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。
编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。 这意味着可以通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。

8、什么情况下会发生动态绑定?
只有通过指针或者引用调用虚函数时会发生动态绑定

9、当基类指针指向一个在堆上的派生类对象时,需要把基类析构函数写成vitural,否则成了静态绑定,会调用基类的析构函数,导致派生类析构不了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值