如果虚基类存在一个构造函数, 虚基类的使用并不是很简单。
为了便于理解,引入一个新术语:最晚辈派生类(most-derived)。
见下面代码:
#include
<
iostream
>
using
namespace
std;

class
base
{
protected:
int a;
public:
base(int aa) // constructor
{
a=aa;
}
}
;

class
derivedA:
virtual
public
base
{
protected:
int b;
public:
derivedA(int aa, int bb):base(aa) // constructor
{
b=bb;
}
void show()
{
cout<<a<<endl;
cout<<b<<endl;
}
}
;

class
derivedB:
virtual
public
base
{
protected:
int c;
public:
derivedB(int aa, int cc):base(13) // constructor
{
c=cc;
}
void show()
{
cout<<a<<endl;
cout<<c<<endl;
}

}
;

class
AB:
public
derivedA,
public
derivedB
{

public:
AB(int aa, int bb, int cc) : derivedA(aa, bb), derivedB(aa, cc), base(33) {} // constructor
void show()
{
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
}
}
;

int
main()
{
derivedA aa(1, 2);
aa.show(); cout<<endl;

derivedB bb(3, 4);
bb.show(); cout<<endl;
AB ab(5, 6, 7);
ab.show();

return 0;
}
输出
1
2
13
4
33
6
7
最晚辈派生类是当前所在的类,当考虑构造函数时它尤其重要。
在前面的例子中,基构造函数里的最晚辈派生类是base;
在derivedA构造函数中,derivedA是最晚辈派生类;
在AB构造函数中, AB是最晚辈派生类。
打算使用一个虚基类时,最晚辈派生类的构造函数的职责是对虚基类进行初始化。
这意味着该类不管离虚基类多远,都有责任对虚基类进行初始化。
参考: 《Thinking in C++》
width="728" scrolling="no" height="90" frameborder="0" align="middle" src="http://download1.youkuaiyun.com/down3/20070601/01184120111.htm" marginheight="0" marginwidth="0">
为了便于理解,引入一个新术语:最晚辈派生类(most-derived)。
见下面代码:










































































输出
1
2
13
4
33
6
7
最晚辈派生类是当前所在的类,当考虑构造函数时它尤其重要。
在前面的例子中,基构造函数里的最晚辈派生类是base;
在derivedA构造函数中,derivedA是最晚辈派生类;
在AB构造函数中, AB是最晚辈派生类。
打算使用一个虚基类时,最晚辈派生类的构造函数的职责是对虚基类进行初始化。
这意味着该类不管离虚基类多远,都有责任对虚基类进行初始化。
参考: 《Thinking in C++》
width="728" scrolling="no" height="90" frameborder="0" align="middle" src="http://download1.youkuaiyun.com/down3/20070601/01184120111.htm" marginheight="0" marginwidth="0">