0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
本文档为个人边学习边记录的C++笔记,非教程,笔记中会存在引用他人文章内容的部分,被引用的原文不会被特殊标记出来,但会在参考文档中给出原文链接。
0x01 虚基类
当某类部分或全部直接基类是从另一个共同基类派生而来时,在这些直接基类中从上一级共同基类继承来的成员就有相同的名称。在派生类对象中,这些同名数据成员在内存中同时拥有多个副本,同一个函数名会有多个映射。可以使用作用域分辨符来唯一表示并分别访问他们,也可以将共同基类设置为虚基类,这时从不同路径继承过来的同名数据成员在内存中就只有一个副本,同一个函数名也只有一个映射。这样就解决了同名成员的为衣标识问题。
虚基类的生命是在派生类的定义过程中进行的,其语法形式为:
class 派生类名:virtual 继承方式 基类名
声明了虚基类后,虚基类的成员函数在进一步派生过程中和派生类一起维护同一个数据副本。
例:虚基类举例
#include <iostream>
using namespace std;
class Base0{
public:
int var0;
void fun0(){cout << "Member of Base0 " << endl;}
};
class Base1:virtual public Base0{
public:
int var1;
};
class Base2:virtual public Base0{
public:
int var2;
};
class Derived:public Base1, public Base2{
public:
int var;
void fun(){cout << "Member of Derived" << endl;}
};
int main() {
Derived d;
d.var0 = 2; //直接访问虚基类的数据成员
d.fun0(); //直接访问虚基类的函数成员
return 0;
}
运行结果:
Member of Base0
《C++语言程序设计(第4版)》书上所有章节出现的示例源代码随着学习的深入会陆续上传至github,代码为个人手动输入并通过编译,有的示例代码可能没有注释:https://github.com/fyw4/C-plus-plus-learning-example
以上。
参考文档:
郑莉 董渊 何江舟.《C++语言程序设计(第4版)》[M].北京:清华大学出版社。