C++上机实验报告-实验五.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
C++上机实验报告-实验五全文共7页,当前为第1页。C++上机实验报告-实验五全文共7页,当前为第1页。实验五 继承与派生 C++上机实验报告-实验五全文共7页,当前为第1页。 C++上机实验报告-实验五全文共7页,当前为第1页。 实验目的 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)类有座位数(SeatNun)等属性。从bicycle和motorcar派生出摩托车(motorbicycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程尝试。 实验内容及实验步骤 1.编写程序定义基类Animal,成员变量age定义为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示: error C2248 : 'age' : cannot access private member declared in class 'Animal' error C2248 : 'age' : cannot access private member declared in class 'Animal' 把age改为公有成员变量后重新编译就可以了。程序名:lab7_1.cpp。 2.编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名:lab7_2.cpp。 3.用debug功能跟踪程序lab7_2的执行过程,观察基类和派生类的构造函数和析构函数的执行情况。 4.编写程序定义一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名:lab7_3.cpp。 编译成功后,把vehicle设置为非虚基类,再编译一次,此时系统报错,无法编译成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。 思考题 1.如何在已有的类的基础上设计新的类? 采用类的派生的方法,利用基类派生出子类,子类继承基类的属性,从而在已有基类的基础上设计新的派生类,模式如下: class 派生类名:继承方式 基类名1,继承方式 基类名2,…,继承方式 基类名n { 派生类成员声明; }; 2.基类和派生类对象的构造顺序是怎样的? 先调用基类的构造函数,然后再调用内嵌对象(派生类中的对象)的构造函数。基类构造函数的调用顺序是按照派生类定义时的顺序,而内嵌对象的构造函数调用顺序是按照成员在类C++上机实验报告-实验五全文共7页,当前为第2页。C++上机实验报告-实验五全文共7页,当前为第2页。中声明的顺序。 C++上机实验报告-实验五全文共7页,当前为第2页。 C++上机实验报告-实验五全文共7页,当前为第2页。 3.如何利用虚基类解决二义性问题? 将共同基类设置为虚基类,语法为: class 派生类名:virtual 继承方式 基类名 源程序 Lab7_1.cpp #include<iostream> using namespace std; class Animal//Animal类 { /*private: int age;*/ public: int age; Animal(){} ~Animal(){} Animal(int ); }; class Dog:public Animal//Dog类,Animal的公有派生类 { private: int number; public: Dog(){} ~Dog(){} Dog(int,int); void setAge(int ); void showNumber(); void showAge(); }; Animal::A 在C++中,继承是一种重要的面向对象特性,它允许我们创建一个新的类(派生类),该类基于已存在的类(基类),并可以扩展或修改基类的功能。实验五主要探讨了继承、派生以及虚基类的概念和使用,旨在帮助学生深入理解这些核心概念。 1. **继承与派生**: - 继承允许派生类继承基类的成员(包括数据成员和成员函数)。实验要求定义一个基类`Animal`,然后派生出`Dog`类。当`age`是私有成员时,`Dog`类的`SetAge`成员函数无法直接访问,因为私有成员在派生类中是不可见的。将`age`改为公有成员后,`Dog`就可以直接访问并修改它。 2. **访问控制与构造函数**: - 实验中要求定义基类`BaseClass`和派生类`DerivedClass`,通过观察构造函数和析构函数的执行情况来理解成员的访问权限。在C++中,构造函数用于初始化对象,而析构函数则在对象生命周期结束时执行,释放资源。基类的构造函数会在派生类构造函数之前调用,析构函数则相反,确保正确地初始化和清理对象。 3. **虚基类**: - 在多继承场景下,如果不使用虚基类,可能会出现二义性问题。实验要求创建一个`Vehicle`基类,派生出`Bicycle`、`Motorcar`和`Motorbicycle`类。如果`Vehicle`不是虚基类,那么在多重继承时可能出现二义性,因为每个派生类可能包含多个基类副本。通过将`Vehicle`设置为虚基类,可以确保只有一个`Vehicle`实例存在,避免二义性。 4. **构造顺序与析构顺序**: - 当创建一个派生类对象时,构造函数的调用顺序是:首先调用最远的基类构造函数,然后逐级调用中间的基类构造函数,最后是派生类本身的构造函数。析构时,顺序与构造相反,首先是派生类的析构函数,然后逐级调用基类的析构函数。 5. **思考题解答**: - 如何设计新类?在已有类基础上,可以通过派生来创建新类,如`class 新类名: 继承方式 基类名1, ...`,新类可以扩展基类功能,也可以覆盖或新增成员。 - 构造顺序:基类构造函数先于派生类构造函数执行,内嵌对象的构造函数按照它们在类中声明的顺序执行。 - 解决二义性问题:通过将共同基类声明为虚基类,如`class 派生类名: virtual 继承方式 基类名`,确保所有派生类都共享同一基类实例。 在实验过程中,学生不仅需要编写代码实现这些要求,还需要通过调试和运行程序来观察和理解继承、派生以及虚基类在实际操作中的效果。这有助于加深对C++面向对象特性的理解和应用。
- 粉丝: 192
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助