C++基础知识之"虚继承"

fengjingtu

多继承的应用

如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性

如果在多条继承路径上有一个公共的基类,那么在继承路径的某处 汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象

要使这个公共基类在派生类中只产生一个子对象,必须对这个基类声明为虚继承,使这个基类成为虚基类。

虚继承声明使用关键字:virtual

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
using namespace std;
class base
{
public:
base()
{
cout << "base construct" << endl;
}
int b;
};
class base1 :virtual public base//对b的访问不明确,需要加上virtual
{
public:
base1()
{
cout << "base1 construct" << endl;
}
int b1;
};
class base2 : public base//对b的访问不明确,需要加上virtual
{
public:
int b2;
base2()
{
cout << "base2 construct" << endl;
}
};
class myclass :public base1, public base2
{
public:
int c;
myclass()
{
cout << "myclass construct" << endl;
}
};
void virtual_test()
{
myclass myc;
myc.b1 = 10;
myc.b2 = 10;
myc.c = 10;
//myc.b = 10;//对b的访问不明确,需要加上virtualo
cout << "base=" << sizeof(base) << endl;//4
cout << "base1=" << sizeof(base1) << endl;//12 加上virtual后增加了一些属性,实现虚继承的手段
cout << "base2=" << sizeof(base2) << endl;//8
cout << "myclass=" << sizeof(myclass) << endl;//24

}
int main_virtual_test()
{
virtual_test();
cout<<"hello world"<<endl;
system("pause");
return 0;
}
//如果一个派生类从多个基类派生,而这些基类又都继承于同一个基类,那么使用虚继承
//虚继承使编译器只调用一次祖类的构造函数。
//多继承总是会存在问题,所以引出多态。

继承总结

继承是面向对象程序设计实现软件重用的重要方法。程序员可以在已有基类的基础上定义新的派生类。

单继承的派生类只有一个基类。多继承的派生类有多个基类。

派生类对基类成员的访问由继承方式和成员性质决定。

创建派生类对象时,先调用基类构造函数初始化派生类中的基类成员。调用析构函数的次序和调用构造函数的次序相反。

C++提供虚继承机制,防止类继承关系中成员访问的二义性。

多继承提供了软件重用的强大功能,也增加了程序的复杂性。