面向对象程序设计实验三报告

更新时间:2023-09-30 02:20:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验三 继承、多态和虚函数

班级 :13电科2 学号 :Xb13640220 姓名:饶君燕

一、实验目的:

(1) 了解面向对象程序设计中继承性、多态性的概念;

(2) 掌握单继承、多重继承中基类成员访问属性的变化规律及访问方法; (3) 掌握类族中构造函数和析构函数的定义方法及调用顺序; (4) 掌握虚函数的定义和使用方法;

二、实验任务:

1. 分别采用公有继承、私有继承、保护继承完成类的设计。 基类如下:

class Student {public:

l;} void get_value()

{cin>>num>>name>>sex;} void display( )

{cout<<\ cout<<\ cout<<\ private : int num; string name; char sex; };

通过继承Student类,完成派生类Student1的设计(提示:应增加成员函数void get_value_1()及void display_1();数据成员 int age及char addr[30]),并写出派生类的实现和演示程序。在程序中应包括接受输入数据的函数。当程序运行时,输入num,name,sex,age,addr的值,程序应能输出以上5个数据的值。

2. 对有继承关系的程序结构进行分析。 class A //A为基类 {public: void f1( ); int i; protected:

void f2(); int j; private: int k; };

class B: public A //B为A的公用派生类 {public: void f3( ); protected: int m; private: int n; };

class C: public B //C为B的公用派生类 {public: void f4(); private: int p; };

int main()

{A a1; //a1是基类A的对象 B b1; //b1是派生类B的对象 C c1; //c1是派生类C的对象 return 0; }

问题:

(1) 在main函数中能否用通过派生类B的对象b1来引用从基类A继承来的

成员i,j,k?

(2) 派生类B中的成员函数能否调用基类A中的成员函数f1、f2? (3) 派生类B中的成员函数能否引用基类A中的i,j,k? (4) 能否在main函数中通过C类对象c1引用基类A的成员i,j,k和类B的

成员m,n?

(5) 能否在main函数中用C类对象c1以c1.f1(),c1.f2(),c1.f3(),c1.f4()的形式调

用f1(),f2(),f3(),f4()?

(6) 派生类C的成员函数f4能否调用基类A的成员函数f1,f2及B类中的f3?

3.继承关系下,构造函数的调用顺序。 #include using namespace std; class A {

public:

A(){a=0;b=0;} A(int i){a=i;b=0;} A(int i,int j){a=i;b=j;}

void display(){cout<<\ private: int a; int b; };

class B : public A {

public: B(){c=0;}

B(int i):A(i){c=0;}

B(int i,int j):A(i,j){c=0;}

B(int i,int j,int k):A(i,j){c=k;} void display1() {display();

cout<<\ }

private: int c; };

int main() { B b1; B b2(1); B b3(1,3); B b4(1,3,5); b1.display1(); b2.display1(); b3.display1(); b4.display1(); return 0; }

问题:

(1) 阅读上述程序,写出运行时的输出结果;上机运行验证结果的正确性。 (2) 对程序结果进行分析,重点要指出构造函数的调用过程 (3) 为上述A、B类添加析构函数,并分析析构函数在继承关系下的调用顺序。

4.参照教材例6.1,定义Point(点)类,由Point类派生出Circle(圆)类,再由Circle类派生出Cylinder(圆柱体)类。写一个虚函数用于输出类族中各类的名字。分析如果该函数不是虚函数,输出又将是怎样?为什么?

三、实验结果

1、程序:

#include } #include void display_1() using namespace std; { display(); class Student cout<<\{public: cout<<\ void get_value() } { cout<<\请输入学号,姓名,性别, 年龄,地址\ private: cin>>num>>name>>sex;} int age; void display() char addr[30]; {cout<<\}; cout<<\ cout<<\ } int main() private: { int num; Student1 stud1; string name; stud1.get_value_1(); char sex; stud1.display_1(); }; return 0; } class Student1:private Student {public:

void get_value_1()

{get_value(); cin>>age>>addr;

2、问题解答: (1)在main函数中能否用通过派生类B的对象b1来引用从基类A继承来的成员i,j,k?

答:派生类B是公有继承,能访问基类A公有数据成员i,基类A保护数据成员j,无法访问基类A的私有数据成员k。

(2)派生类B中的成员函数能否调用基类A中的成员函数f1、f2?

答:能,派生类B是公有继承,能访问基类A公有成员函数f1,基类A保护成员函数f2。

(3)派生类B中的成员函数能否引用基类A中的i,j,k?

答:派生类B是公有继承,能引用基类A公有数据成员i,基类A保护数据 ,成员j,无法引用基类A的私有数据成员k。

(4)能否在main函数中通过C类对象c1引用基类A的成员i,j,k和类B的成员m,n?

答:派生类C是公有继承,能访问基类A公有数据成员i,基类A保护数据成员j,无法访问基类A的私有数据成员k,能访问B类公有数据成员m,无

法访问B类的私有数据成员n。

(5)能否在main函数中用C类对象c1以c1.f1(),c1.f2(),c1.f3(),c1.f4()的形式调用f1(),f2(),f3(),f4()?

答:可以调用,派生类C是公有继承,f1是基类A公有成员函数,f2是基类A保护成员函数,f3是B类公有成员函数,f4是C类公有成员函数。 (6)派生类C的成员函数f4能否调用基类A的成员函数f1,f2及B类中的f3?

答:可以调用,派生类C是公有继承,f1是基类A公有成员函数,f2是基类A保护成员函数,f3是B类公有成员函数。

3、问题解答:

(1) 阅读上述程序,写出运行时的输出结果;上机运行验证结果的正确性。

(2) 对程序结果进行分析,重点要指出构造函数的调用过程

先祖先后自己 (1、先调用基类构造函数 2、再执行派生类构造函数本身) A(){a=0;b=0;} B(){c=0;} B b1; A(int i){a=i;b=0;} B(int i):A(i){c=0;} B b2(1); A(int i,int j){a=i;b=j;} B(int i,int j):A(i,j){c=0;} B b3(1,3);

B(int i,int j,int k):A(i,j){c=k;} B b4(1,3,5);

(3)为上述A、B类添加析构函数,并分析析构函数在继承关系下的调用顺序。 答:添加析构函数的代码: #include B(int i):A(i){c=0;} using namespace std; B(int i,int j):A(i,j){c=0;} class A B(int i,int j,int k):A(i,j){c=k;} {public: void display1() A(){a=0;b=0;} {display(); A(int i){a=i;b=0;} cout<<\ A(int i,int j){a=i;b=j;} } void display(){cout<<\a=\ ~B(){} b=\ private: ~A(){} int c; private: }; int a; int b; int main() }; { B b1; B b2(1); class B : public A B b3(1,3); {public: B b4(1,3,5); B(){c=0;} b1.display1();

本文来源:https://www.bwwdw.com/article/cddd.html

Top