文章概述
- 多继承的定义以及多继承的语法;
- 虚继承;
多继承的定义以及多继承的语法
a. 一个类有多个基类,这样的继承关系称为多继承;
b. 多继承声明语法:
class 派生类名: 访问控制符 基类名1,访问控制符 基类名2
{
数据成员和成员函数声明;
}
class A: public B,public c
{
}
图示:
c. 多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。
虚继承
- 产生二义性 ?
class A
{
public:
int x;
};
class B: public A
{
int b;
public:
B(int x)
{
this->x = 10;
}
};
class C : public A
{
int c;
public:
C(int x)
{
this->x = 20;
}
};
class D :public B,public C
{
int d;
public:
D(int x):B(10),C(20)
{
//对于D中的x,到底是从哪个类(B,C)中继承的,不明确,会产生二义性。
this->x = 30;
}
};
对于产生二义性的原因分析在于分析d的对象模型:
其实,产生二义性的原因就在于A的构造函数在c中调用了两次,不知道x是哪个对象的。如果要让A在c中只产生一个对象,则应该对公共基类A声明为虚继承,使得这个公共基类成为虚基类。
2. 在c中只产生一个公共基类的对象
//当类中出现virtual时,C++编译器会对象添加一个vptr指针,同时会产生一个虚函数表
class A
{
public:
int x; //4
public:
A()
{
cout << "A" << endl;
}
};
class B:virtual public A
{
int b; //4
public:
B(int x)
{
this->x = 10;
cout << "B" << endl;
}
};
class C :virtual public A
{
int c; //4
public:
C(int x)
{
this->x = 20;
cout << "C" << endl;
}
};
class D :public B,public C
{
int d; //4
public:
D(int x):B(10),C(20)
{
this->x = 30;
cout << "D" << endl;
}
};
int main()
{
cout << sizeof(A) << endl; //4
cout << sizeof(B) << endl; //12
cout << sizeof(C) << endl; //12
cout << sizeof(D) << endl; //24
return 0;
}
分析d的对象模型:
C++提供虚继承机制,防止类继承关系中成员访问的二义性。