虚继承是C++中一种特殊的继承机制,用于解决菱形继承问题也就是多继承中的二义性问题。在多继承中,如果多个基类共同继承一个公共基类,那么在派生类中可能会出现数据冗余和访问冲突的问题。为了解决这些问题,引入了虚继承机制。
语法:虚继承通过在继承时加上 virtual 关键字实现:
class 父类:virtual 祖父类 {}; // 虚继承
class 子类:继承方式 父类1, 继承方式 父类2... {};//普通多继承
虚继承的原理
C++在设计虚继承机制中,提供一个vtable(虚表)和vptr(虚指针)。虚指针指向虚表,虚表就是用来存放虚基类(祖父类)成员的地址。
基类在采用虚继承时,编译器就会给这个类分配一个vptr(虚指针,32位地址空间占4个字节,64位地址空间占8个字节),要访问虚基类的成员时,就通过查表,虚基类的成员只保留一份,不管谁来访问,就是通过查表,虚表和虚指针都是通过编译器自身维护。
由于虚基类的成员只保留一份,从整体来说,虚继承比普通多继承更加节省空间。