虚继承、虚函数

This commit is contained in:
huihut 2018-03-27 00:03:12 +08:00
parent 9be9cf701e
commit 87c3df1fbb

View File

@ -517,7 +517,29 @@ virtual int A() = 0;
Data vall = { 0, "Anna" };
```
### 虚继承、虚函数继承
### 虚继承、虚函数
#### 虚继承
虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。
底层实现原理与编译器相关,一般通过**虚基类指针**和**虚基类表**实现每个虚继承的子类都有一个虚基类指针占用一个指针的存储空间4字节和虚基类表不占用类对象的存储空间需要强调的是虚基类依旧会在子类里面存在拷贝只是仅仅最多存在一份而已并不是不在子类里面了当虚继承的子类被当做父类继承时虚基类指针也会被继承。
实际上vbptr指的是虚基类表指针virtual base table pointer该指针指向了一个虚基类表virtual table虚表中记录了虚基类与本类的偏移地址通过偏移地址这样就找到了虚基类成员而虚继承也不用像普通多继承那样维持着公共基类虚基类的两份同样的拷贝节省了存储空间。
#### 虚继承与虚函数
* 相同之处:都利用了虚指针(均占用类的存储空间)和虚表(均不占用类的存储空间)
* 不同之处:
* 虚继承
* 虚基类依旧存在继承类中,只占用存储空间
* 虚基类表存储的是虚基类相对直接继承类的偏移
* 虚函数
* 虚函数不占用存储空间
* 虚函数表存储的是虚函数地址
### 内存分配和管理