实验四 继承与派生
一、实验目的:
掌握利用单继承和多重继承的方式定义派生类的方法;
深刻理解在各种继承方式下构造函数和析构函数的执行顺序;
理解和掌握公有继承,私有继承和保护继承对基类成员的访问机制; 理解虚基类的概念以及引入虚基类的目的和作用。
二、实验时间: 三、实验地点: 四、实验内容:
1.运行以下程序,并对运行结果进行分析 #include base(int a) {cout<<\"constructing base class\"< base bobj; int m; public: subs(int a,int b,int c):base(a),bobj(c) {cout<<\"constructing sub class\"< subs s(1,2,3); } 2.设计一个圆类circle和一个桌子类table,另外设计一个圆桌类roundtable,从前2个类派生的,要求输出一个圆桌的高度,面积和颜色等数据。 3.设计一个虚基类base,包含姓名和年龄私有数据成员以及相关成员函数,由 它派生出领导类leader,包含职务和部门私有数据成员以及相关成员函数。再由base派生出工程师类engineer,包含职务和专业私有数据成员以及相关成员函数。然后由leader和engineer类派生出主任工程师chairman。采用一些数据进行测试。 五、实验要求: 在上机前写出全部源程序; 六、实验结果分析: 实验内容: 1.运行以下程序,并对运行结果进行分析 #include base(int a) {cout<<\"constructing base class\"< base bobj; int m; public: subs(int a,int b,int c):base(a),bobj(c) {cout<<\"constructing sub class\"< subs s(1,2,3); } 运行结果: 结果分析:程序的主函数只申明了派生类subs的对象,生成的对象调用了派生类的构造函数。先是调用基类的构造函数,然后调用内嵌对象的构造函数。基类的构造函数的调用顺序是按照派生类定义时的顺序,即先调用base(a),再2(默认构造函数),再bobj(c)。所以先执行了base(a)的constructing base class,再执行了bobj(c) constructing base class(这里其实第二步是先调用base的默认构造函数执行2)。最后执行subs函数体的构造函数constructing sub class。而析构函数的顺序正与构造函数的方向相反。 2.设计一个圆类circle和一个桌子类table,另外设计一个圆桌类roundtable,从前2个类派生的,要求输出一个圆桌的高度,面积和颜色等数据。 运行结果: 代码: #include using namespace std; const float PI = 3.14; class Circle { private: float r; public: Circle(){} void CircleInput() { cout<<\"Input r:\"; cin>>r; } float get_area() { return PI*r*r; } }; class Table { private: float high; char colour[20]; public: Table(){} void TableInput() { cout<<\"Input high and colour:\"; cin>>high; cin>>colour; } float get_high(){return high;} char *get_colour(){return colour;} }; class RoundTable: public Circle, public Table { private: float price; public: RoundTable(){} void RoundTableInput() { cout<<\"Input price:\"; cin>>price; } float get_price(){return price;} void Display() { cout<<\"The RoundTable's area:\"< RoundTable c; c.CircleInput(); c.TableInput(); c.RoundTableInput(); c.Display(); return 0; } 3.设计一个虚基类base,包含姓名和年龄私有数据成员以及相关成员函数,由它派生出领导类leader,包含职务和部门私有数据成员以及相关成员函数。再由base派生出工程师类engineer,包含职务和专业私有数据成员以及相关成员函数。然后由leader和engineer类派生出主任工程师chairman。采用一些数据进行测试。 运行结果: 代码: #include using namespace std; class Base { private: int n; char *name; int age; public: Base(){} void Binput() { cout<<\"Input name and age:\"; char *pname = new char; cin>>pname; name = pname; cin>>age; } void Bdisplay() { cout<<\"name:\"< private: char *position; char *department; public: Leader(){}; void Linput() { cout<<\"Input position and department:\"; char *pposition = new char; char *pdepartment = new char; cin>>pposition; position = pposition; cin>>pdepartment; department = pdepartment; } void Ldisplay() { cout<<\"position:\"< private: char *major; public: Engineer(){} void Einput() { cout<<\"Input major:\"; char *pmajor = new char; cin>>pmajor; major = pmajor; } void Edisplay() { cout<<\"major:\"< public: Chairman(){} void Cinput() { Binput(); Linput(); Einput(); } void Cdisplay() { Bdisplay(); Ldisplay(); Edisplay(); } }; int main() { Chairman C; C.Cinput(); C.Cdisplay(); return 0; } 七、实验心得体会及问题反馈: 本实验主要学习加深了面向对象继承与派生的概念掌握和简单的运用。 第一,分析了基类和派生类构造函数和析构函数的调用顺序的关系。第二,了解了基类和派生类之间的联系和关系,并且掌握了派生类的概念和操作。第三,了解了虚基类的作用,在派生类和基类有同名函数时,避免二义性。 最后,做完这个实验,又对面向对象继承与派生有了更深一层的了解。 因篇幅问题不能全部显示,请点此查看更多更全内容