实验七继承与派生
【实验目的】
1、掌握继承的概念。
2、理解派生类与基类的关系。
3、理解不同的继承类型。
4、掌握继承下的构造函数和析构函数。
5、掌握单继承和多继承使用方法。
6、理解静态成员。
【实验内容】
1、上机分析下面程序,理解继承下构造函数和析构函数的执行顺序。
#include
using namespace std;
class A
{
public:
A()
{
cout<<"Constructor1_A"<< x << endl;
}
A( int m ) : x( m )
{
cout<<"Constructor2_A"<< x << endl;
}
~A()
{
cout<<"Destructor_A"<< x << endl;
}
private:
int x;
};
class B : public A
{
public:
B()
{
cout<<"Constructor1_B"<< y << endl;
}
B( int m, int n, int l ) : A( m ), a( n ), y( l )
{
cout<<"Constructor2_B"<< y < } ~B() { cout<<"Destructor_B"<< y << endl; } private: A a; int y; }; int main() { B b1, b2(5,6,7); return 0; } 2、在下面一段类定义中,Derived类是有直接基类Base1和Base2所公有派生的,Derived 类包含有两个间接基类Base,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。 #include using namespace std; class Base{ protected: int x; public: Base(){x=0;} }; class Base1:public Base{ public: Base1(){} }; class Base2:public Base{ public: Base2(){} }; class Derived: (1) { public: Derived(){} void Init(int x1,int x2){ (2) ; (3) ; } void output(){cout< }; void main() { Derived d; d.Init(5,9); d.output(); } 3、在下面一段类定义中,Derived类公有继承了基类Base。需要填充的函数有注释内容给出了功能。并补充定义主函数,完成派生类对象的定义。 #include using namespace std; class Base{ private: int mem1,mem2; public: Base(int m1,int m2) {mem1=m1;mem2=m2;} void output(){cout< }; class Derived:public Base { private: int mem3; public: //构造函数,由m1和m2分别初始化mem1和mem2,由m3初始化mem3 Derived(int m1,int m2,int m3); //输出mem1,mem2和mem3数据成员的值 void output(){ (1) ; cout< }; Derived::Derived(int m1,int m2,int m3): (2) { (3) ;} 4、上机分析下面程序,掌握静态成员 # include using namespace std; class sample { public: sample ( ){ ++n; } static int HM(){ return n; } ~sample ( ){ --n; } private: static int n; }; int sample::n = 10; int main() { sample c1,c2; sample *p = new sample(); cout< delete p; cout< return 0; } 5、设计一个具有继承和派生的类,分析程序输出结果,理解类的继承与派生。参考程序: #include using namespace std; class A { public: void f(int i) {cout< void g() {cout<<"g\n";} }; class B:A { public: void h(){cout<<"h\n";} A::f; }; void main() { B d1; d1.f(6); d1.g(); d1.h(); } 问题: ⑴、执行该程序时,哪个语句会出现编译错误?为什么? ⑵、去掉出错语句后,执行该程序后输出结果如何? ⑶、程序中派生类B是从基类A中继承来的,这种缺省继承方式是哪种继承方式? ⑷、派生类B中,A::f的含意是什么? ⑸、将派生类B的继承改为公有继承方式该程序将输出什么结果? 6、定义一个车类(Vehicle),含有数据成员wheelnum,speed。派生出自行车类(Bicycle), 增加成员height;派生出汽车类(Car),增加成员seatnum。要求各类提供必要的构造函数初始化基本成员,并添加显示输出的成员函数。编写主函数,测试这个层次结构,输出自行车和汽车的相关信息。 实验目的与要求: 1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。 2.掌握派生类构造函数初始化基类成员和对象成员的方法。 3.掌握内联函数和默认函数。 4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。 实验过程及内容: 1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在 派生类中访问基类成员。 ①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员; ②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数; ③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。 编程测试所定义的类体系。 本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。要求计算圆柱的底面积、侧面积、全面积和体积。 请编写所有完整的成员函数,并编写主函数进行验证。 数据处理 1. (1) (2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。(3)在Line类中添加两个数据成员。 2. #include 注意派生类的构造函数中对基类数据成员的初始化方法(即 Circle(double xv,double yv,double vv):Point(xv,yv)), 以及构造函数中对对象成员的初始化方法(即 Line(double xv1,double yv1,double xv2,double yv2) : start(xv1,yv1),end(xv2,yv2){ } ) 【要求】 (1)建立工程,录入上述程序,改变数据实验之。 (2)修改Point 类的数据成员x ,y 的访问权限为private ,再运行,结果如何? (3)如果不将Line 类设为 Point 类的友元,应采取什么措施?为哪个类增加数据或函数成员? 2.编程:多层派生练习,由上题Point 类和Circle 类继续派生出Cylinder 类。要求计算圆柱体的底面积、侧面积、全面积和体积。 实验2 派生类与继承 实验课程名:面向对象程序设计(C++) 专业班级:学号:姓名: 实验时间:实验地点:指导教师: 2.1实验目的和要求 (1) 掌握派生类的声明方法和派生类构造函数的定义方法。 (2) 掌握不同继承方式下,基类成员在派生类中的访问属性。 (3) 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。 (4) 学习虚基类在解决二义性问题中的作用。 二、实验内容 一、构造一个类Geometry 及其派生类,该类主要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。 试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。 实验代码如下: #include ~Geometry(){} double GetArea(){}//求面积函数double GetPerimeter(){}//求体积函数double Getcolume(){}//求周长函数 virtual show(){} }; class Circle:public Geometry { public: Circle(double i) { radiums=i; } ~Circle(){} double GetArea(); double Getcolume(); double R() { return radiums; } show(); private: 1.定义一个哺乳动物类Mammal,并从中派生出一个狗类Dog,下面给出Mammal类的定义,要求: (1)添加Dog类的颜色数据成员,访问属性为私有,通过SetColor和GetColor成员函数来对颜色进行设置和获取。 (2)分别为基类和派生类添加相应的构造函数(有参、无参)和析构函数,并进行测试。 class Mammal { protected: int itsAge; int itsWeight; public: int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal { //定义Dog类的数据成员和成员函数 }; 改: #include 第八章继承与多态习题 一.基本概念与基础知识自测题 8.1填空题 8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。(3)类 的对象可作为(4)类的对象处理,反过来不行,因为(5)。如果强制转换则要注意(6)。 答案:(1)基类 (2)派生类 (3)派生类 (4)基类 (5)派生类有一些新成员 (6)只能派生类强制转换为基类 8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员, protected成员成为派生类的(2)成员,对private成员是(3)。公有派生可以使其类的(4),所以公有派生是主流。 答案:(1)public成员 (2)protected成员 (3)不可访问 (4)接口不变 8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为 (2)。继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。 答案:(1)单继承 (2)多重继承 (3)层次 (4)单继承 8.1.6 C++中多态性包括两种多态性:(1)和(2)。前者是通过(3)实现的, 而后者是通过(4)和(5)来实现的。 答案:(1)编译时的 (2)运行时的 (3)函数和运算符的重载 (4)类继承关系 (5)虚函数 8.2简答题(以下习题题号可能和教材不一致!) 8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。 3.派生类的构造函数体中的操作。 8.2.2什么叫派生类的同名覆盖(override)?继承和派生实验报告
c++派生类与继承实验报告材料
c++实验8 继承与派生上机练习题
C 第八章继承与派生习题习题解答
实验6-继承与派生(1)