目录
一.什么是虚继承,虚基类
- 虚继承:在继承定义中包含了virtual关键字的继承关系
- 虚基类:在虚继承体系中的通过virtual继承而来的基类
- 注意:在class B :virtual public A中,A称为B的虚基类,而不是A就是一个虚基类通俗的讲,虚继承是为了节约内存
- 如:类B、C都继承类A,D继承类B和C。为了节省内存空间,可以将B、C对A的继承定义为虚拟继承,此时A就成了虚拟基类。
二.定义虚继承的基本格式
class 派生类: virtual 基类1,virtual 基类2,…,virtual 基类n
{
…//派生类成员声明
};
例如:
class B :virtual public A
{
public:
int b;
};
class C :virtual public A
{
public:
int c;
};
三.虚继承的构造函数
#include<iostream>
using namespace std;
class person
{
public:
person(int x)
{
cout<<"person 构造"<<endl;
}
~person()
{
cout<<"person 析构"<<endl;
}
};
class faculty : public person
{
public:
faculty(int x):person(x)
{
cout<<"faculty 构造"<< endl;
}
};
class student : public person
{
public:
student(int x):person(x)
{
cout<<"student 构造"<< endl;
}
};
class ta : public faculty, public student
{
public:
ta(int x):student(x), faculty(x)
{
cout<<"ta 构造"<< endl;
}
};
int main()
{
ta ta1(30);//创建对象ta1的时候, 会调用构造函数ta(),在调用ta()的构造函数的时候,发现类ta先继承了类faculty,再继承了类student
//所以会首先执行faculty的构造函数,但是发现类faculty又继承了person,(第一步)所以最先执行person的构造函数,然后执行faculty的构造函数
//继承student的时候,发现studnet也继承了person,(第二步)所以最先执行person的构造函数,然后执行student的构造函数
//(第三步)最后执行ta的构造函数
}