实验六继承与派生
c 继承与派生实验报告
c 继承与派生实验报告
C 继承与派生实验报告
实验目的:通过实验,掌握C语言中继承与派生的概念和使用方法,加深对面向对象编程的理解。
实验内容:在C语言中,继承与派生是面向对象编程中非常重要的概念。
在本次实验中,我们将通过一个简单的例子来演示C语言中的继承与派生的用法。
首先,我们定义一个基类(父类)Person,包括姓名和年龄两个成员变量,以及一个显示信息的成员函数。
然后,我们定义一个派生类(子类)Student,继承自Person类,新增一个成员变量学号,并重写显示信息的成员函数。
在实验中,我们首先创建一个Person对象,设置姓名和年龄,然后调用显示信息函数,观察结果。
接着,我们创建一个Student对象,设置姓名、年龄和学号,再次调用显示信息函数,观察结果。
实验结果:通过实验,我们成功实现了C语言中的继承与派生。
我们发现,通过继承,子类Student可以直接使用父类Person中的成员变量和成员函数,同时可以新增自己的成员变量和函数。
这样的设计使得代码更加简洁和灵活,提高了代码的复用性和可维护性。
结论:C语言中的继承与派生是面向对象编程中非常重要的概念,通过本次实验,我们深入理解了这一概念的用法和意义。
掌握了继承与派生的方法后,我们可以更加灵活地设计和编写程序,提高代码的质量和效率。
总结:通过本次实验,我们对C语言中的继承与派生有了更深入的理解,加深了对面向对象编程的认识。
在今后的学习和工作中,我们将更加灵活地运用继承与派生的方法,提高代码的质量和效率。
继承和派生实验报告
实验目的与要求:1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。
2.掌握派生类构造函数初始化基类成员和对象成员的方法。
3.掌握内联函数和默认函数。
4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。
实验过程及内容:1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。
①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。
编程测试所定义的类体系。
本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。
2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。
要求计算圆柱的底面积、侧面积、全面积和体积。
请编写所有完整的成员函数,并编写主函数进行验证。
数据处理1.(1)(2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。
(3)在Line类中添加两个数据成员。
2. #include <iostream>#include <cmath>using namespace std;#define PI 3.14159class Point{friend class Line;protected:double x, y ;public:Point(){x = 0 ; y = 0 ; }Point(double xv,double yv){ x = xv; y = yv; }double Area(){return 0;}void Show() {cout<<"x="<<x<<' '<<"y="<<y<<endl;}};class Circle :public Point{protected:double radius;public:Circle(){ x = 0; y = 0; radius = 0; }Circle(double xv,double yv,double vv):Point(xv,yv){ //调用基类构造函数radius = vv;}Circle(Circle & cir):Point(cir){ //按赋值兼容规则cir可为Point实参radius=cir.radius;}Circle & operator=(Circle & cir){this->Point::operator=(cir); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式radius=cir.radius;return *this;}double Area(){return PI*radius*radius;}void Show()cout<<"x="<<x<<' '<<"y="<<y<<" radius="<<radius<<endl; //访问基类的数据成员}};class Cylinder:public Circle {double high;public:Cylinder(){ x = 0; y = 0; radius = 0;high=0; }Cylinder(double xv,double yv,double vv,double kv):Circle(xv,yv,vv){ //调用基类构造函数high=kv;}Cylinder(Cylinder & cyl):Circle(cyl){ //按赋值兼容规则cyl可为Cylinder实参high=cyl.high;}Cylinder & operator=(Cylinder & cyl){this->Circle :: operator=(cyl); //在派生类中定义重载的拷贝赋值操作符有固定的标准格式high=cyl.high;return *this;}double ceArea(){return 2*PI*radius*high;}double quArea(){return ceArea()+2* Area();}double volume(){return Area()*high;}void Show(){cout<<"x="<<x<<' '<<"y="<<y<<' '<<"radius="<<radius<<' '<<"high="<<high<<endl; //访问基类的数据成员};class Line{Point start,end; //对象成员public:Line(){} //对象成员初始化Line(double xv1,double yv1,double xv2,double yv2) :start(xv1,yv1),end(xv2,yv2){ }double GetLength() {return sqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y));}double Area(){return 0;}void Show(){cout<<"start point:\n";start.Show();cout<<"end point:\n";end.Show();}};int main(){Point pt(0,0);Circle cl1(100,100,10),cl2(cl1),cl3;Cylinder h1(50,50,20,30),h2(h1),h3;Line ln1(0,0,100,100),ln2;cout<<"点面积:"<<pt.Area()<<endl;pt.Show();cout<<"cl1圆面积:"<<cl1.Area()<<endl;cl1.Show();cout<<"cl2圆面积:"<<cl2.Area()<<endl;cl2.Show();cl3=cl1;cout<<"cl3圆面积:"<<cl3.Area()<<endl;cl3.Show();cout<<"h1底面积:"<<h1.Area()<<endl;cout<<"h1侧面积:"<<h1.ceArea()<<endl;cout<<"h1全面积:"<<h1.quArea()<<endl;cout<<"h1体积:"<<h1.volume()<<endl;h1.Show();cout<<"h2底面积:"<<h2.Area()<<endl;cout<<"h2侧面积:"<<h2.ceArea()<<endl;cout<<"h2全面积:"<<h2.quArea()<<endl;cout<<"h2体积:"<<h2.volume()<<endl;h2.Show();h3=h1;cout<<"h3底面积:"<<h3.Area()<<endl;cout<<"h3侧面积:"<<h3.ceArea()<<endl;cout<<"h3全面积:"<<h3.quArea()<<endl;cout<<"h3体积:"<<h3.volume()<<endl;h3.Show();cout<<"线面积:"<<ln1. Area()<<'\t'<<"线长度:"<<ln1. GetLength()<<endl;ln1.Show();ln2.Show();return 0;}实验结论:通过这次实验,我对类的继承和派生,派生类构造函数初始化基类成员和对象成员的方法,以及赋值兼容原则有了更深的理解。
实验六继承与派生之欧阳理创编
继承与组合一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; }void Add(int a,int b){ x+=a;y+=b;}void display(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;}private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;}void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;}};int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B...destructor A...destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl; }int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f()<<endl; }~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;}};class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11destructor D...destructor B...destructor A...destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1 {public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1{public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2{public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
实验继承与派生
实验项目:继承与派生实验目的:1.学习定义和使用类的继承关系,定义派生类2.熟悉不同继承方式下对基类成员的访问控制实验任务:1.定义一个基类Animal,有私有整形成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗2.定义一个基类BaseClass,有整形成员变量Number,构造其派生类,观察其构造函数和析构函数的执行情况。
3.定义一个车类(vehicle)基类,有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(Seatnum)等属性。
,在继承和过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题变成试试看。
实验步骤:1.编写程序定义Animal,成员变量age定义为私有的。
构造其派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现错误提示:程序名lab5_1.cpp2.编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。
程序名lab5_2.cpp3.用debug功能跟踪程序lab5_2.cpp的执行过程,观察基类和派生类的构造函数和析构函数的的执行过程。
4.编写程序定义车类(vehicle),由此派生出自行车(bicycle)类、汽车(motorcar),把vehicle设置为虚基类。
再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。
程序名lab5_3.cpp。
编译成功后把vehicle设置成非虚基类,在编译一次,此时系统报错,无法编译成功。
(C++)实验报告六:继承与派生
实验6 继承与派生一、实验目的1.理解继承与派生、单继承与多继承的概念;2.理解基类与派生类的定义及使用方法,派生类对象的定义与初始化方法;3.理解继承与派生过程中,把派生类作为基类构成类族的概念及虚基类的概念。
二、实验环境一台PC机,Windows XP操作系统,Visual C++ 6.0开发环境。
三、实验内容1、由在校人员类(Person)作为基类派生出学生类(Student):实验步骤:#include <iostream>#include <string>using namespace std;class Person{public:Person(int i,char *n, char s, int a){ID=i;name=n;sex=s;age=a;};int getID(){return ID;}void show(){cout<<"ID: "<<ID<<endl;cout<<"name : "<<name<<endl;cout<<"sex: "<<sex<<endl;cout<<"age: "<<age<<endl;}private:int ID;string name;char sex;int age;};class Student:public Person{public:Student(int i,char *n,char s,int a,float m,float p,float e,float c):Person(i,n,s,a){math=m;physical=p;english=e;cpp=c;total=math+physical+english+cpp;}void show(){Person::show();cout<<"math: "<<math<<endl;cout<<"physical: "<<physical<<endl;cout<<"english: "<<english<<endl;cout<<"C++: "<<cpp<<endl;cout<<"total: "<<total<<endl;}private:float math,physical,english,cpp,total;};void main(){Person p1(1,"张帅",'M',22);p1.show();cout<<endl;Student s1(9901,"林维",'S',21,65,70,75,88);s1.show();}实验结果:2、由学生类、课程类作为基类,共同派生出选课类。
实验六继承与派生之欧阳光明创编
继承与组合欧阳光明(2021.03.07)一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; }void Add(int a,int b){ x+=a;y+=b;}void display(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;}private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;}void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;}};int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B...destructor A...destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl; }int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f()<<endl; }~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;} };class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"D constructor..."<<endl;} ~D(){cout<<"destructor D..."<<endl;}};int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11destructor D...destructor B...destructor A...destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1{public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1{public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2{public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
实验6 类的继承与派生课前讲解
课前讲解—类的继承与派生一、继承原理这里举一个继承的例子,定义两个类Point类,代表一个点;Rectangle类,代表一个矩形。
这里Point类(x,y)代表一个点的坐标,把它作为父类;Rectangle类,把它作为Point类的子类。
为啥这样考虑呢?因为一个点的位置决定了以后,就可以以这个点作为矩形的左上角坐标,然后再加上矩形的宽度,高度两个分量值,就可以直接构成一个矩形了。
我们可以看到,左边是Point类包含的所有属性和方法;右边则是Rectangle类包含的所有属性和方法,它的一部分属性和方法是从父类继承下来的。
任何一个矩形对象,都必须需要知道左上角的坐标位置(x,y)和其宽度w,高度h才能知道这是一个怎样的矩形。
因此每当我们用语句创建一个矩形对象的时候,需要调用initRectangle函数做矩形的初始化工作,要为这个函数传入四个参数:所传入的参数需要赋给对象的x,y,w,h分量。
由于在Rectangle类中只定义了宽度w,高度h两个属性,因此x,y的初始化工作它并不能直接完成,此时,就需要调用父类(Point类)里面的initPoint(x,y)函数来完成x,y分量的初始化,等父类的初始化工作完成后,然后再回到子类(Rectangle类)中完成w,h分量的初始化。
总结:Point类是父类,派生出Rectangle子类。
父类中定义的属性x,y被子类继承,子类中则增加了新的属性w,h。
二、派生类的构造函数和析构函数上述程序不是太好,如果引入构造函数和析构函数的概念,把上述的init函数改成构造函数,则代码会更好一些:经过上述定义后,每当创建Rectangle对象时,系统就会分配一块内存给这个对象:总共需要4个int空间,这四个数据成员都需要正确的赋予数值,才能定义一个有意义的矩形。
其中w,h两个属性是Rectangle对象可以直接访问的,而x,y两个属性继承自Point,而且是private,因此在Rectangle对象中不能直接访问这两个属性,只能通过间接调用getX(),getY()函数获取 x,y属性的值。
继承与派生实验报告
继承与派生实验报告继承与派生实验报告引言:继承与派生是面向对象编程中的重要概念,通过继承,一个类可以派生出子类,从而实现代码的复用和扩展。
本文将通过实验来探讨继承与派生的概念、原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握如何在编程语言中实现继承和派生;3. 熟悉继承与派生的应用场景。
实验步骤:1. 创建父类:首先,我们创建一个名为"Animal"的父类,该类具有属性和方法,例如"age"和"eat()"。
2. 创建子类:接下来,我们创建一个名为"Cat"的子类,该类继承自"Animal"类。
在子类中,我们可以重写父类的方法或添加新的方法。
3. 实例化对象:通过实例化父类和子类的对象,我们可以调用它们的方法和访问它们的属性。
4. 测试继承与派生:我们可以通过调用父类和子类的方法,观察它们的行为是否符合预期。
实验结果:在创建父类"Animal"时,我们定义了一个"age"属性和一个"eat()"方法。
在创建子类"Cat"时,我们继承了父类的属性和方法,并添加了一个新的"meow()"方法。
在实例化父类对象时,我们可以通过调用"eat()"方法来模拟动物进食的行为。
而在实例化子类对象时,我们既可以调用从父类继承而来的"eat()"方法,也可以调用子类特有的"meow()"方法来模拟猫咪的叫声。
通过实验,我们发现继承与派生的优势在于代码的复用和扩展。
我们只需在父类中定义一次通用的属性和方法,然后让不同的子类继承父类,即可实现代码的复用。
同时,子类还可以通过重写父类的方法或添加新的方法,实现代码的扩展和个性化。
讨论与应用:继承与派生不仅仅局限于上述的父类和子类关系,它还可以在多层次的继承结构中发挥作用。
实验指导书06 类的继承与派生
C++ 面向对象程序设计 实验指导书
实验 06 类的继承与派生
1.1 时间安排 4 学时
本实验安排 4 个实验课时。
1.2 实验目的和要求
1、 从深层次上理解继承与派生的关系 2、 掌握不同继承方式下,从派生类/对象内部和外部对基类成员的访问控制权限。 3、 掌握单继承和多继承的使用方法,尤其是派生类构造函数的声明方式。 4、 掌握继承与派生下构造函数与析构函数的调用顺序。 5、 理解“类型兼容”原则 6、学习利用虚基类解决二义性问题。
C++ 面向对象程序设计 实验指导书 Supervisor * Sptr=new Supervisor("Tanya",8000.00,5000.00); //动态申请空间 cout<<"Name:"<<e.getName()<<endl; cout <<"Pay:"<<e.pay(60)<<endl; //设每月工作小时 cout <<"Name:"<<m.getName()<<endl; cout <<"Pay:"<<m.pay(40)<<endl; cout <<"Name:"<<Sptr->getName()<<endl; cout <<"Pay:"<<Sptr->pay(40)<<endl; //参数这里不起作用 cout<<"/*********类型兼容规则测试********************/"<<endl; /*三个Display,实质上调用的均是Employee的pay函数, 因此,在显示m、*Sptr的对象内容时,出现了与上面不符的结果。*/ Display(e,60); Display(m,40); Display(Sptr,40); }
C++继承与派生实验报告
C++继承与派生实验报告应用数学学院信息与计算科学(信息计算)专业1 班、学号3111008106姓名吴伟栓教师评定_________________实验题目继承与派生一、实验目的与任务实验目的:(1)学习声明和使用类的继承关系,声明派生类。
(2)熟悉不同继承方式下对基类成员的访问控制。
(3)学习利用虚基类解决二义性问题。
实验任务:(1)声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
(2)声明一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
(3)声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop 等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle 和motorcar派生出摩托车(motocycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
(4)(选做)从实验六中的people(人员)类派生出student(学生)类,添加属性:班号char classNo[7];从people类派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacherradviser;从graduate类和teacher 类派生出TA(助教生)类,注意虚基类的使用。
实验六-继承与派生
实验六-继承与派生继承与组合一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; }void Add(int a,int b){ x+=a;y+=b;}voiddisplay(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;} private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;} void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;} };int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B...destructor A...destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl; }int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;} private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){ cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f()<<e ndl; }~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;}};class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11destructor D...destructor B...destructor A...destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl; }};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1 {public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1 {public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2{public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
实验六继承与派生之欧阳音创编
继承与组合一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; }void Add(int a,int b){ x+=a;y+=b;}voiddisplay(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;}private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;}void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;} };int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B...destructor A...destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl; }int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;} private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f() <<endl; }~B(){cout<<"destructor B..."<<endl;} };class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;}};class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11destructor D...destructor B...destructor A...destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1{public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1{public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2{public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
实验6-继承与派生(1)
实验六继承与派生(1)1.1 实验目的(1)理解继承的含义以及声明;(2)理解共有派生、私有派生和保护派生的含义以及使用;(3)理解单派生类中构造函数和析构函数的调用顺序。
1.2 实验内容1、定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点:(1)CLine类含有计算直线长度和斜率的成员函数;(2)CCircle类含有计算圆面积的成员函数。
2、程序阅读。
(1)以下程序有两大错误,请修改程序,写出程序运行结果并分析。
#include <iostream>using namespace std;class CBase{public:CBase(int a):a(a){}protected:void print(){cout<<"a="<<a<<endl;}private:int a;};class CDerive : public CBasepublic:void print(){CBase::print();cout<<"b="<<b<<endl;}private:int b;};int main(){CDerive d;d.print();CBase b;b.print();return 0;}(2)分析基类和派生类的构造和析构顺序。
#include <iostream>using namespace std;class CBase{public:CBase(int a):a(a){cout<<"base structure"<<endl;}~CBase(){cout<<"base destructure"<<endl;}void print(){cout<<"a="<<a<<endl;}protected:int a;};class CDerive : public CBase{public:CDerive(int a, int b,int c):CBase(a),b(b),c(c){cout<<"derive structure"<<endl;}~CDerive(){cout<<"derive destructure"<<endl;}void print(){CBase::print();cout<<"b.a="<<b.a<<endl;cout<<"c="<<c<<endl;}private:CBase b;int c;};int main(){CDerive d(1,2,3); -----------------------------------------------------①d.print();return 0;}1.3 实验报告要求1.包含源程序和程序运行结果截图。
实验六继承与派生之令狐文艳创作
继承与组合令狐文艳一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; }void Add(int a,int b){ x+=a;y+=b;}void display(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;}private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;} void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;}};int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B...destructor A...destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl; }int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f()<<endl;}~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;}};class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11destructor D...destructor B...destructor A...destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1{public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1{public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2 {public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
实验六继承与派生之欧阳美创编
继承与组合一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; }void Add(int a,int b){ x+=a;y+=b;}void display(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;}private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;}void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;}};int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B...destructor A...destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl;}int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f()<<endl; }~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;}};class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"Dconstructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;} };int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11destructor D...destructor B...destructor A...destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:{cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1{public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1{public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2 {public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
实验6 继承与派生
实验6 继承与派生一、实验目的1.理解继承的含义,掌握派生类的定义和实现方法。
2.理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地使用继承层次中的各种类成员。
3.理解保护成员在继承中的作用,能够在适当的时候使用保护成员以便派生类成员可以访问基类的部分非公开成员。
4.理解虚基类在类的继承层次中的作用,虚基类的引入对程序运行时的影响,能够对使用虚基类的简单程序写出程序结果。
二、知识要点1.继承继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类。
从已定义类产生新类的过程称为派生。
已存在的用来派生新类的类为基类,又称父类。
从已存在的类派生出的新类称为派生类,又称为子类。
如,从哺乳动物类派生出狗类,哺乳动物是父类,狗是子类;从汽车类派生出轿车类,汽车是父类,轿车是子类。
在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。
从一个基类派生的继承称为单继承,从多个基类派生的继承称为多继承。
2.派生类的定义格式(1)单继承的定义格式class<派生类名>:<继承方式><基类名>{<派生类新定义成员>};其中:基类名是已经定义类的名称。
派生类名是新定义的一个类的名字,它是从基类中派生的;派生类是按指定继承方式从基类派生的,继承方式常用的有如下3种:public 表示公有继承private 表示私有继承protected 表示保护继承在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构。
(2)多继承的定义格式class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,……{<派生类新定义成员>};其中继承方式1、继承方式2、……是3种继承方式public、private和protected之一。
多继承与单继承的主要区别从定义格式上看,主要是多继承的基类多于一个。
实验六继承与派生之欧阳家百创编
继承与组合欧阳家百(2021.03.07)一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; }void Add(int a,int b){ x+=a;y+=b;}void display(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;}private:int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;}void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;}};int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B...destructor A...destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl; }int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;}int f(){A::f();Aobj.f();return ++y;}void display(){cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f()<<endl; }~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;}};class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11destructor D...destructor B...destructor A...destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1{public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1{public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2 {public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
继承与组合一、实验目的1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合二、实验内容1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include <iostream>using namespace std;class A{public:A(){cout<<"A::A() called.\n";}virtual ~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){ cout<<"B::B() called.\n";buf=new char[i];}virtual ~B(){ delete []buf;cout<<"B::~B() called.\n";}private:char *buf;};void fun(A *a){ cout<<"May you succeed!"<<endl;delete a;}int main(){A *a=new B(15);fun(a);return 0;}1、(1)程序运行结果:A::A() called.B::B() called.May you succeed!B::~B() called.A::~A() called.(2)#include<iostream>using namespace std;class A{public:A(int a,int b):x(a),y(b){ cout<<"A constructor..."<<endl; } void Add(int a,int b){ x+=a;y+=b;}void display(){ cout<<"("<<x<<","<<y<<")";}~A(){cout<<"destructor A..."<<endl;}private:_ int x,y;};class B:private A{private:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B constructor..."<<endl;}void Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2; j+=y2;}void display(){A::display();Aobj.display();cout<<"("<<i<<","<<j<<")"<<endl;}~B(){cout<<"destructor B..."<<endl;}};int main(){B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();return 0;}(2)程序运行结果:A constructor...A constructor...B constructor...(1,2) (1,1) (3,4)(2,5) (1,1) (8,11) destructor B... destructor A... destructor A...(3)#include<iostream>using namespace std;class A{public:A(int a):x(a){ cout<<"A constructor..."<<x<<endl; } int f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:int x;};class B:public virtual A{private:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B constructor..."<<y<<endl;} int f(){A::f();Aobj.f();return ++y;}void display(){ cout<<A::f()<<"\t"<<Aobj.f()<<"\t"<<f()<<endl; }~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){ cout<<"C constructor..."<<endl;}};class D:public C,public virtual A{public:D(int a,int b,int c):C(a,b,c),A(c){ cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};int main(){D d(7,8,9);d.f();d.display();return 0;}(3)程序运行结果:A constructor (9)A constructor (9)B constructor (9)C constructor...D constructor...12 12 11 destructor D... destructor B... destructor A... destructor A...(4)#include <iostream>using namespace std;class Base1{public:Base1(){cout<<"class Base1!"<<endl;}};class Base2{public:Base2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1 {public:Level1(){cout<<"class Level1!"<<endl;}};class Level2: public Base2,virtual public Base1 {public:Level2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2 {public:TopLevel(){cout<<"class TopLevel!"<<endl;}};int main(){TopLevel obj;return 0;}(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。
要求如下:建立一个基类Publication存储出版物的标题title、出版物名称name、单价price及出版日期date。
用Book类和T ape类分别管理图书和磁带,它们都从Publication类派生。
Book类具有保存图书页数的数据成员page,Tape类具有保存播放时间的数据成员playtime。
每个类都有构造函数、析构函数,且都有用于从键盘获取数据的成员函数inputData(),用于显示数据的成员函数display()。
2、#include <iostream>using namespace std;#include <string>class Date{public:Date(){}Date(int y,int m,int d);Date(Date &d);void SetDate(int y,int m,int d);void ShowDate();private:int year,month,day;};Date::Date(int y,int m,int d){ year=y; month=m; day=d; } Date::Date(Date &d){ year=d.year; m onth=d.month; day=d.day; } void Date::SetDate(int y,int m,int d){ year=y; month=m; day=d; }void Date::ShowDate(){ cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl; } class Time{public:Time(){}Time(int h,int m,int s);Time(Time &t);void SetTime(int h,int m,int s);void ShowTime();private:int hour,minute,second;};Time::Time(int h,int m,int s){ hour=h; minute=m; second=s; }Time::Time(Time &t){ hour=t.hour; minute=t.minute;second=t.second; }void Time::SetTime(int h,int m,int s){ hour=h; minute=m; second=s; } void Time::ShowTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; } class Publication{public:Publication(){}Publication(string title,string name,float price,int y,int m,int d);void inputData();void display();private:string title;string name;float price;Date date;};Publication::Publication(string title,string name,float price,int y,int m,int d):title(title),name(name),price(price),date(y,m,d){}void Publication::inputData(){ cout<<"Please input title, name, price, publication date of a book:"<<endl;cin>>title>>name>>price;int year,month,day;cin>>year>>month>>day;date.SetDate(year,month,day);}void Publication::display(){ cout<<"title="<<title<<endl;cout<<"name="<<name<<endl;cout<<"price="<<price<<endl;cout<<"date=";date.ShowDate();}class Book:public Publication{public:Book(){}Book(string title,string name,float price,int y,int m,int d,int page);void inputData();void display();private:int page;};Book::Book(string title,string name,float price,int y,int m,int d,int page):Publication(title,name,price,y,m,d){this->page=page;}void Book::inputData(){ Publication::inputData();cout<<"Please the pages of the book:"<<endl;cin>>page;}void Book::display(){ Publication::display();cout<<"page="<<page<<endl;}class Tape:public Publication{public:Tape(){}Tape(string title,string name,float price,int y,int m,int d,Time playtime);void inputData();void display();private:Time playtime;};Tape::T ape(string title,string name,float price,int y,int m,int d,Time playtime) :Publication(title,name,price,y,m,d),playtime(playtime){}void Tape::inputData(){ Publication::inputData();cout<<"Please the playtime of the tape:"<<endl;int hour,minute,second;cin>>hour>>minute>>second;playtime.SetTime(hour,minute,second);}void Tape::display(){ Publication::display();cout<<"playtime=";playtime.ShowTime();}int main(){ Book book1("教材","C++程序设计",30.00,2009,6,1,300);book1.display();cout<<endl;Time time1(30,10,20);Tape tape1("磁带","C++程序设计视频",10.00,2009,8,1,time1);tape1.display();Book book2;book2.inputData();book2.display();cout<<endl;Tape tape2;tape2.inputData();tape2.display();return 0;}3.分别定义教师类Teacher和干部类Cadre,采用多重继承的方式由这两个类派生出新类Teacher_Cadre(教师兼干部类)。