派生与继承-多重派生

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同时继承类CBase1CBase2,所以类CBase1CBase2先后被构造第一次,在类CDerive的私有成员中,创建了两个对象CBase1 b1;CBase2 b2;所以CBase1CBase2先后被构造第二次,四次构造完成之后,再构造类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();  

 

}

 

问题一:在不改变原有程序意图的前提下,改正上面程序,使程序正确输出,并单步运行分析程序执行的过程。

 改正:

       

       此程序中存在虚继承,B1B2类虚继承A类,A是他们的虚基类,应在B1B2 类前加关键字virtual

 分析:main函数从类A开始执行,创立了一个类A的空间,通过A->B1,A->B2的路径初始化基类,所以两次调用了A类的构造函数。而C1C2分别调用了B1B2,所以C1C2都调用了B1B2的构造函数且又两次创建了A的构造函数。又通过了B1->C3,B2->C3的路径,C3调用了B1,B2A的构造函数。

猜你喜欢

转载自blog.csdn.net/qq_38855717/article/details/80209087