实验四 继承与派生
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 : 定义控制台应用程序的入口点。