使用時機
當一個class繼承自不同的多個class時,會繼承到他們的資料定義。這時可能會有重複的資料被繼承到,造成運作不符合預期,例如:
#include <iostream>
using namespace std;
class CA //common base class of CB and CC
{
public:
int x;
CA(int a = 0) { x = a; }
};
class CB :public CA
{
public:
int y;
CB(int a = 0, int b = 0) :CA(a) { y = b; }
};
class CC :public CA
{
public:
int z;
CC(int a = 0, int b = 0) :CA(a) { z = b; }
};
class CD : public CB, public CC
{
public:
int w;
CD(int a = 0, int b = 0, int c = 0, int d = 0 ,int e = 0) :CB(a, b), CC(c, d) {
w = e;
}
void ShowVal() {
cout << "x = " << CB::x << " y = " << y
<< " x = " << CC::x << " z = " << z;
cout << " w = " << w << endl;
}
};
int main()
{
CD obj(5, 4, 3, 2, 1);
obj.ShowVal(); //what happens?
return 0;
}
輸出為: x = 5 y = 4 x = 3 z = 2 w = 1
如果改以virtual 方式繼承,相同的資料只會用到同一塊記憶體。例如:
#include <iostream>
using namespace std;
class CA //common base class of CB and CC
{
public:
int x;
CA(int a = 0) { x = a; }
};
class CB : virtual public CA
{
public:
int y;
CB(int a = 0, int b = 0) :CA(a) { y = b; }
};
class CC : virtual public CA
{
public:
int z;
CC(int a = 0, int b = 0) :CA(a) { z = b; }
};
class CD : public CB, public CC
{
public:
int w;
CD(int a = 0, int b = 0, int c = 0, int d = 0
,int e = 0) : CA(a), CB(a, b), CC(c, d) {
w = e;
}
void ShowVal() {
cout << "x = " << CB::x << " y = " << y
<< " x = " << CC::x << " z = " << z;
cout << " w = " << w << " x = " << x << endl;
}
};
int main()
{
CD obj(5, 4, 3, 2, 1);
obj.ShowVal(); //what happens?
return 0;
}
輸出為: x = 5 y = 4 x = 5 z = 2 w = 1 x = 5
呼叫順序
constructors
first, virtual base classes in declaration order
then, other base classes in declaration order
destructors
in the reverse order of the constructors