|
发表于 2004-5-10 21:43:03
|
显示全部楼层
研究了一下多重继承,现在可以回答第2题了。
题目中的派生类使用了虚拟继承。因此要由最晚派生类的构造函数来对虚基类进行初始化。但题目中的最晚派生类lastlevel没有显示调用虚基类的构造函数进行初始化,所以编译器调用的是虚基类base1的缺省构造函数。结果自然是base1: a=0 b=0。如果在lastlevel中对虚基类的构造函数作显示调用进行虚基类的初始化,则结果会是base1: a=3 b=9。
下面是对虚基类进行显示调用的代码,编译运行之后,自然看到结果:
[php]
#include<iostream>
using namespace std;
class base1
{
int a, b;
public:
base1 (int aa = 0, int bb = 0) //构造函数
{
a = aa;
b = bb;
cout << "base1 class!" << endl;
}
void show ()
{
cout << "base1: a=" << a << " b=" << b << endl;
}
};
class base2
{
public:
base2 ()
{
cout << "base2 class!" << endl;
}
void show2 ()
{
cout << "base2: " << endl;
}
};
class level1:public base2, virtual public base1
{
public:
level1 (int a, int b):base1 (a, b)
{
cout << "level1 class!" << endl;
}
};
class level2:public base2, virtual public base1
{
public:
level2 (int a, int b):base1 (a, b)
{
cout << "level2 class!" << endl;
}
};
class lastlevel:public level1, virtual public level2
{
public:
lastlevel (int a, int b):level1 (a, b), level2 (a, b), base1(a,b)
{
cout << "lastlevel class!" << endl;
}
};
int main ()
{
lastlevel obj (3, 9);
obj.show (); //直接调用间接基类base的公有成员函数show()
}
[/php] |
|