c++之虚

虚基类指针和虚基类表是在子类虚继承父类时在子类中创建的,和父类无关。
虚函数指针和虚函数表是继承自父类的,子类可以重写父类虚函数,覆盖虚函数表中函数的地址。

**

1、虚基类指针vbptr,虚基类表vbtable

**
用于解决菱形继承问题。
虚基类指针和虚基类表都是在子类虚继承的时候,在子类中创建的,和父类没有关系。
Animal中有一个name属性
Sheep和Tuo继承Animal类,SheepTuo继承了Sheep类和Tuo类。则SheepTuo中就有两份name属性。浪费资源
SheepTuo不直接继承Sheep和Tuo类,而是改为虚继承。
则SheepTuo对象中就有两个指针和一个name属性,还有分别属于Sheep和Tuo父类的两张虚基类表
两个指针分别指向这两张虚基类表,表中存放指向name属性的指针。

2、虚函数指针vfptr,虚函数表

虚函数不能直接调用,其首先根据虚函数指针找到虚函数表,在找到对应的函数地址,调用对应函数。
虚函数表属于类,虚函数指针属于类的对象。
因此构造函数不能为虚函数
为了解决多态的动态晚绑定。
使用父类接受子类对象,父类调用子类的函数
Animal a = new Cat();
a.speak();实现调用Cat类的函数;
需要将父类的函数成员设置为虚函数,在其子类中重写函数,即可实现。
对于没有成员属性只有成员函数类称之为空类,其大小为1个字节。
如果类中有了虚函数,则这个类为虚类,其大小为4个字节,保存了一个指针,称之为虚函数指针,指向一个虚函数表。
子类继承了父类的虚函数指针和虚函数表,并且子类重新修改了虚函数表,让其能够指向正确的函数地址。

**

3、纯虚函数与抽象类

**
基类中的虚函数一般是不需要实现功能的,主要是为了实现多态,因此基类中的虚函数可以直接写为纯虚函数,一个类中一旦有了纯虚函数,这个类就成为抽象类。
子类继承抽象类必须要重写所有的纯虚函数。否则子类也成为了抽象类。
抽象类不能实例化对象。
纯虚函数写法:
virtual 返回值 函数名 (参数列表)=0;

**

4、虚析构函数与纯虚析构函数

**
对象在生命周期结束时,需要调用析构函数释放其开辟在堆区中的资源。因此利用多态使用父类释放子类资源,需要将父类的析构函数写成虚析构函数,才会调用子类的析构函数。
并且所有类的析构函数都需要实现,因此如果非要将父类的析构函数写成纯虚析构,则需要在类外部再定义父类的析构函数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值