小谈继承机制

小谈继承机制

继承是C++面向对象的三大特性,即允许某个类型的对象获得另一种类型对象的属性的方法。结合多态特性,又可以分为实现继承(直接继承父类的属性和方法,无需重写)和接口继承(只继承父类的属性和方法,子类需要对内容进行重写)。

一、继承的三种方式

公有继承、保护继承和私有继承。但是无论哪种继承方式,都不能继承父类的私有成员; 但是子类会将父类的所有成员进行拷贝,并对私有成员进行隐藏。
1、是否可以避开访问权限去访问到私有成员变量呢?
首先我们需要知道,关于访问权限是在编译期进行检查的,运行期不做任何权限检查。同时这也是实现多态(new 一个子类指针可以为父类指针赋值,也就是强制类型转化)的关键。
那么,我们只需要取到私有成员地址即可。比如私有成员函数,我们通过将其声明为虚函数可以将其函数地址存储在虚函数表中,这样我们通过直接访问虚函数表即可完成函数调用。

二、继承中的构造/析构顺序

1)构造: 父类 > 子类
2)析构: 子类 > 父类
为什么在执行构造(实例化对象前)时的顺序是这样的?
因为在实例化对象时,先创建成员,然后调用构造函数。那么既然成员继承自父类,那么就需要先调用父类的构造函数,然后在调用子类的构造函数。

三、单继承

在类成员中分为静态成员和非静态成员。
其中对于非静态成员来说,成员变量都会被重新拷贝一份,而对于函数来说,则是使用同一份数据(至少公有成员和保护成员函数是这样的),并且只有当发生重定义或者重写的时候才会改变函数地址。而对于静态成员,存储在数据段,子类和父类共享一份数据。
1、友元函数
友元函数是不能被继承的,它只能访问到父类的成员,并不能访问到子类中新添加的成员。(题外话,多态场景下友元函数不能声明为虚函数
2、继承中同名函数的处理
子类会对父类中的同名函数进行隐藏。注意在继承中,如果父类和子类中同名函数的参数列表不同,仍然会隐藏,并不会发生重载

四、多继承(菱形继承)

所谓多继承,即一个子类同时拥有多个父类。
在多继承问题中,如果发生三代继承及以上的情况,有可能造成原始基类发生两次构造,也就是菱形继承。
1、如何解决菱形继承问题?
采用虚继承机制。即基类的两个子类通过虚继承的方式继承基类,这样所有的子类就会共享一个基类,并且会忽略其他子类对基类的构造函数调用,而是由最底层的派生类去调用基类的构造函数
在这里插入图片描述

2、虚继承对象模型
1)会在对象内存空间的首地址上添加一个虚基类表指针
2)虚基类表指针指向虚基类表,而虚基类表存放在数据段
3)虚函数表中存放的是偏移量(当前子类距离基类的存储偏移量)
4)内存布局。如下图所示,在D类中首先会放置父类的虚函数表,表中存放即是偏移量(该虚基类距离当前类的距离)
在这里插入图片描述
3、虚继承下虚基类的指针指向派生类的new 内存为什么无法释放?
因为其指向不对。因为在虚继承的派生类内存模型中,虚基类的成员是放在后面的(如上图所示)。即该指针并不是指向数据的头部,所以无法释放内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值