派生与继承-多重派生
1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
class CBase1
{
public:
CBase1(int a):a(a)
{
cout<<"base1 structure..."<<endl;
}
~CBase1()
{
cout<<"base1 destructure..."<<endl;
}
void print()
{
cout<<"a="<<a<<endl;
}
protected:
int a;
};
class CBase2
{
public:
CBase2(int b):b(b)
{
cout<<"base2 structure..."<<endl;
}
~CBase2()
{
cout<<"base2 destructure..."<<endl;
}
void print()
{
cout<<"b="<<b<<endl;
}
protected:
int b;
};
class CDerive : public CBase1, public CBase2
{
public:
CDerive()
{
cout<<"derive structure..."<<endl;
}
~CDerive()
{
cout<<"derive destructure..."<<endl;
}
void print()
{
CBase1::print();
CBase2::print();
b1.print();
b2.print();
cout<<"c="<<c<<endl;
}
private:
CBase1 b1;
CBase2 b2;
int c;
};
void main()
{
CDerive d;
d.print();
}
问题一:该函数没有头文件及命名空间。
问题二:在基类和派生类中,没有合适的构造函数可用。
结果分析:
类CDerive同时继承类CBase1和CBase2,所以类CBase1和CBase2先后被构造第一次,在类CDerive的私有成员中,创建了两个对象CBase1 b1;CBase2 b2;所以类CBase1和CBase2先后被构造第二次,四次构造完成之后,再构造类CDerive的构造函数。相反析构过程与构造过程相反,从派生类到基类依次析构。
2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include<iostream>
using namespace std;
//*************************************
class A
{
public:
A(){cout<<"class A created"<<endl;}
void print(){cout<<"class A"<<endl;}
void SetA(int x){a=x;}
int GetA(){return a;}
private:
int a;
};
//*************************************
class B1:public A{
public:
B1(){cout<<"class B1 created"<<endl;}
void print(){cout<<"class B1"<<endl;}
void SetB1(int x){b1=x;}
int GetB1(){return b1;}
private:
int b1;
};
//************************************
class B2:public A{
public:
B2(int x):b2(x){cout<<"class B2 created"<<endl;}
void print(){cout<<"class B2"<<endl;}
void SetB2(int x){b2=x;}
int GetB2(){return b2;}
private:
int b2;
};
//************************************
class C1:public B1{
public:
C1(){cout<<"class C1 created"<<endl;}
void print(){cout<<"class C1"<<endl;}
void SetC1(int x){c1=x;}
int GetC1(){return c1;}
private:
int c1;
};
//************************************
class C2:public B1{
public:
C2(){cout<<"class C2 created"<<endl;}
void print(){cout<<"class C2"<<endl;}
void SetC2(int x){c2=x;}
int GetC2(){return c2;}
private:
int c2;
};
//************************************
class C3:public B1,public B2{
public:
C3(int x,int y):c3(x),B2(y){cout<<"class C3 created"<<endl;}
void print(){cout<<"class C3"<<endl;}
void SetC3(int x){c3=x;}
int GetC3(){return c3;}
private:
int c3;
};
//******************************************
void main( )
{
A x;
B1 y;
B2 z(9);
C1 m;
C2 n;
C3 k(5,8);
k.print();
k.B2::print();
k.B1::print();
k.A::print();
}
改正:
此程序中存在虚继承,B1、B2类虚继承A类,A是他们的虚基类,应在B1、B2 类前加关键字virtual。
分析:main函数从类A开始执行,创立了一个类A的空间,通过A->B1,A->B2的路径初始化基类,所以两次调用了A类的构造函数。而C1,C2分别调用了B1,B2,所以C1,C2都调用了B1,B2的构造函数,且又两次创建了A的构造函数。又通过了B1->C3,B2->C3的路径,C3调用了B1,B2,A的构造函数。