【C++学习笔记】虚基类(一)

1.为什么要引入虚基类?

在类的继承中,如果我们遇到这种情况:
“B和C同时继承A,而B和C都被D继承”
在此时,假如A中有一个函数fun()当然同时被B和C继承,而D按理说继承了B和C,同时也应该能调用fun()函数。这一调用就有问题了,到底是要调用B中的fun()函数还是调用C中的fun()函数呢?在C++中,有两种方法实现调用:
(注意:这两种方法效果是不同的)

  1. 使用作用域标识符来唯一表示它们比如:B::fun()
  2. 另一种方法是定义虚基类,使派生类中只保留一份拷贝。

作用域标识符表示

例子:

     #include
         using namespace std;
         class base{
         	public:
         		base(){a=5;cout<<"base="<【C++学习笔记】虚基类(一)_第1张图片
实际上构造函数调用可以通过树状图来写,特别是对于多级继承关系,可以写出每一级里面继承的基类,而每一层最后一个树枝是该类的构造函数,而每一个基类又可以用同样的方法展开,直到分离到最后完全没有继承关系的基类为止。

虚基类的调用:

#include
using namespace std;
	class base{
	public:
		base(){
			a=5;cout<<"base="<【C++学习笔记】虚基类(一)_第2张图片

虚基类的另一种理解:虚基类的核心在于这个“虚”字,base1和base2本身作为虚基类相当于算是基类base的两个延伸(就相当于是base的一个外挂),而对于derived类来说,最本质的基类还是base,而基类base与虚基类base1和base2组成一个基类体系,或者一个基类生态,通过对这个生态中不同虚基类的继承,就可以形成不同的接口,生成不同的派生类。【C++学习笔记】虚基类(一)_第3张图片

虚基类的初始化:

我们対上面的分析再做一个总结:
(1)如果在虚基类中定义有带形参的构造函数**,并且没有定义缺省形参的构造函数,则整个继承结构中,所有直接或者间接的派生类必须在构造函数的成员初始化表中列出对虚基类构造函数的调用。**
这句话是什么意思呢?我们改造上面的代码:

 #include
using namespace std;
class base{
public:
    base(int s){
        a=s;cout<<"base="<【C++学习笔记】虚基类(一)_第4张图片

整理自浙大课程PPT,部分理解为原创,图为原创

你可能感兴趣的:(笔记,C++学习笔记)