虚基类
百度百科中对虚基类的介绍,链接如下:
虚基类的基本原则:
在内存中只能有基类成员的一份拷贝,解决菱形继承基类成员冗余问题,菱形继承形式如下:

若不使用虚基类,则在派生类中会有基类成员的5份拷贝,调用时必须用父类名进行区分;
使用虚基类的话,由于虚基类的成员在内存中只能有一份拷贝,调用时可直接使用派生类对象成员调用方式进行调用(派生类.a);
注意事项:
(1) 一个类可以在一个类族中既被用作虚基类,也被用作非虚基类。----基类被继承时如果使用virtual关键字则基类为虚基类,若不使用virtual关键字,则基类为非虚基类;
(2) 在派生类的对象中,同名的虚基类只产生一个虚基类子对象,而某个非虚基类产生各自的子对象。----虚基类只能被实例化一次;
(3) 虚基类子对象是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。----类A-E以及派生类在写法上都要调用基类的构造函数,但是只有派生类会实际调用基类的构造函数,类A-E虽然写了调用基类的构造函数,但是实际上会被忽略;

在创建D类对象时,调用了D类的构造函数,进而调用了A类的构造函数和B类以及C类的构造函数,但是B类和C类的构造函数并没有调用A类的构造函数,而是仅仅打印了一条信息。
(4) 最远派生类是指在继承结构中建立对象时所指定的类。----指的上图中的类D;
(5) 派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用;如果未列出,则表示使用该虚基类的缺省构造函数。----如上图中BCD类都要列出,不然报错;
(6) 从虚基类直接或间接派生的派生类中的构造函数的成员初始化列表中都要列出对虚基类构造函数的调用。但仅仅用建立对象的最远派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次。----如上图所示。
(7) 在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数执行。----如下图所示,虽然继承列表中E在前,且构造函数调用时E也在前,但是实际调用时还是先调用的A类的构造函数。

虚继承的详细说明:
C++虚继承与虚基类的本质 - 蔷薇理想人生 - 博客园 (cnblogs.com)

浙公网安备 33010602011771号