实验四 继承与派生

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四继承与派生

一、实验目的:

掌握利用单继承和多重继承的方式定义派生类的方法;

深刻理解在各种继承方式下构造函数和析构函数的执行顺序;

理解和掌握公有继承,私有继承和保护继承对基类成员的访问机制;

理解虚基类的概念以及引入虚基类的目的和作用。

二、实验时间:

三、实验地点:

四、实验内容:

1.运行以下程序,并对运行结果进行分析

#include"stdafx.h"

#include

using namespace std;

class base{

int n;

public:

base(int a)

{cout<<"constructing base class"<

cout<<"n="<

}

~base(){cout<<"desstructing base class"<

};

class subs:public base

{ base bobj;

int m;

public:

subs(int a,int b,int c):base(a),bobj(c) {cout<<"constructing sub class"<

cout<<"m="<

}

~subs(){cout<<"destructing sub class"<

};

void main()

{

subs s(1,2,3);

}

●subs s(1,2,3);

subs(int a,int b,int c):base(a),bobj(c)

所以a=1,b=2,c=3,

●class subs:public base,又因为base(a),所以先调用base 传一个参数的构造函数

base(int a),(若此处删去base(a),则会出现如下错误

)

●调用base(int a),所以有

●然后,因为base bobj;所以这里还会调用base(int a)构造函数,此时传入的a值

为bobj(c)中的c,即3,所以有

●再者,才会调用subs的构造函数subs(int a,int b,int

c):base(a),bobj(c)

●相反,在调用析构函数的时候,顺序刚刚好相反,则

~base(){cout<<"desstructing base class==>:"<

~subs(){cout<<"destructing sub class==>:"<

2.设计一个圆类circle和一个桌子类table,另外设计一个圆桌类roundtable,从前2个类派生的,要求输出一个圆桌的高度,面积和颜色等数据。

●Public继承

// 2.cpp : 定义控制台应用程序的入口点。#include"stdafx.h"

#include

#include

using namespace std;

class circle{

private:

float R;

public:

circle(float r){

R=r;

}

void area(){

cout<<"面积为:"<<3.14*R*R<

}

};

class table{

private:

float H;

string color;

public:

table(float h,string c){

H=h;

color=c;

}

void message(){

cout<<"高度为:"<

为:"<

}

};

class roundtable:public circle,public table{ public:

roundtable(float r,float h,string

c):circle(r),table(h,c)

{}

};

int main(){

roundtable a(3,5,"yellow");

a.area();

a.message();

return 0;

}

●Protected继承

class roundtable:protected circle,protected table

●Private继承

class roundtable:private circle,private table

3.设计一个虚基类base,包含姓名和年龄私有数据成员以及相关成员函数,由它派生出领导类leader,包含职务和部门私有数据成员以及相关成员函数。

再由base派生出工程师类engineer,包含职务和专业私有数据成员以及相关成员函数。然后由leader和engineer类派生出主任工程师chairman。采用一些数据进行测试

(写在构造函数里)

// 3.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

using namespace std;

class base{

private:

string name;

int age;

public:

base(string n,int a){

name=n;

age=a;

cout<<"名字:"<

}

};

class leader:virtual public base{

string pos,dept;

public:

leader(string n,int a,string p,string d):base(n,a){

pos=p;

dept=d;cout<<"职位:"<

}

}; class engineer:virtual base{

string pos,speciaty;

public:

engineer(string n,int a,string p,string s):base(n,a){

pos=p;

speciaty=s;cout<<"职位:"<

}

};

class chairman:virtual public leader,virtual public engineer{

public:

chairman(string n,int a,string p,string d,string p1, string

s):base(n,a),leader(n,a,p,d),engineer(n,a,p 1,s){

cout<<"chairman"<

}

};

int main(){

chairman

a("name",10,"pos1","dept","pos2","speciaty" );

return 0;

}

(写在show()函数里) // 3.cpp : 定义控制台应用程序的入口点。

相关文档
最新文档