多态性与虚函数实验报告.pdf

合集下载

虚函数与多态性实验

虚函数与多态性实验

一.实验目的及要求1.进一步熟悉类的设计、运用继承与派生机制设计派生类,合理设置数据成员和成员函数。

2.掌握通过继承、虚函数、基类的指针或引用实现动态多态性的方法。

3.理解并掌握具有纯虚函数的抽象类的作用,在各派生类中重新定义各纯虚函数的方法,以及此时实现的动态多态性。

二.实验内容在自己的文件夹下建立一个名为exp5的工程,在该工程中做如下操作:定义一个抽象类容器类,其中定义了若干纯虚函数,实现求表面积、体积、输出等功能。

由此抽象类派生出正方体、球体和圆柱体等多个派生类,根据需要定义自己的成员变量,在各个派生类中重新定义各纯虚函数,实现各自类中相应功能,各个类成员的初始化均由本类构造函数实现。

(1)在主函数中,定义容器类的指针和各个派生类的对象,使指针指向不同对象处调用相同的函数能执行不同的函数代码,从而实现动态多态性。

(2)定义一个顶层函数void TopPrint(Container &r);使得主函数中调用该函数时,根据实在参数所有的类自动调用对应类的输出函数。

(3)主函数中定义一个Container类对象,观察编译时的错误信息,从而得出什么结论三.实验程序及运行结果#include <iostream>using namespace std;class Base{public:virtual void f(){ cout << "调用Base::f()" << endl; }};class Derived: public Base{public:void f(){ cout << "调用Derived::f()" << endl; } // 虚函数};int main(void){Derived obj; // 定义派生类对象Base *p = &obj; // 基类指针p->f(); // 调用函数f()system("PAUSE");return 0;}2.#include <iostream>using namespace std; //class Base{public:virtual void Show() const{ cout << "调用Base::Show()" << endl; } // 虚函数};class Derived: public Base{public:void Show() const{ cout << "调用Derived::Show()" << endl; }};void Refers(const Base &obj) // 基类引用{obj.Show(); // 调用函数Show()}int main(void){Base obj1;Derived obj2; // 定义对象Refers(obj1); // 调用函数Refers()Refers(obj2);system("PAUSE");return 0;}3.#include <iostream>using namespace std; /class Base{private:int m;public:Base(int a): m(a){ }virtual void Show() const{ cout << m << endl; }// 虚函数};class Derived: public Base{private:int n;public:Derived(int a, int b): Base(a), n(a){ } // 构造函数void Show() const{cout << n << ","; /Base::Show(); // 调用基类的Show() }};int main(void){Base obj1(168);Derived obj2(158, 98);Base *p;p = &obj1;p->Show();p = &obj2;p->Show();p->Base::Show();system("PAUSE");return 0;}4.#include <iostream>using namespace std;class A{public:virtual void Show() const{ cout << "基类A" << endl; } };class B: public A{public:void Show() const{ cout << "派生类B" << endl; } };int main(void){B obj;A *p = &obj;p->Show();system("PAUSE");return 0;}5.#include <iostream>using namespace std;const double PI = 3.1415926;class Shape{public:virtual void Show() const = 0;static double sum;};class Circle: public Shape{private:double radius;public:Circle(double r): radius(r){ sum += PI * radius * radius; }void Show() const{cout << "圆形:" << endl;cout << "半径:" << radius << endl;cout << "面积:" << PI * radius * radius << endl;}};class Rectangle: public Shape{private:double height;double width;public:Rectangle(double h, double w): height(h), width(w){ sum += height * width; }void Show() const{cout << "矩形:" << endl;cout << "高:" << height << endl;cout << "宽:" << width << endl;cout << "面积:" << height * width << endl;}};double Shape::sum = 0;int main(void){char flag = 'Y'; 'Shape *p;while (toupper(flag) == 'Y'){cout << "请选择输入类别(1.圆形2.矩形)";int select;cin >> select;switch (select){case 1:double r;cout << "输入半径:";cin >> r;p = new Circle(r);p->Show();delete p;break;case 2:double h, w;cout << "输入高:";cin >> h;cout << "输入宽:";cin >> w;p = new Rectangle(h, w);p->Show(); // 显示相关信息delete p; // 释放存储空间break;default: // 其它情况, 表示选择有误cout << "选择有误!"<< endl;break;}cout << endl << "是否继续录入信息?(Y/N)";cin >> flag;}cout << "总面积:" << Shape::sum << endl;system("PAUSE");return 0;}6.#include <iostream>using namespace std;const double PI = 3.1415926;const int NUM = 10;class Shape{public:virtual void ShowArea() const = 0;static double sum;};class Circle: public Shape{private:double radius;public:Circle(double r): radius(r){ sum += PI * radius * radius; }void ShowArea() const{ cout << "圆面积:" << PI * radius * radius << endl; }};class Rectangle: public Shape{private:double height;double width;public:Rectangle(double h, double w): height(h), width(w){ sum += height * width; }void ShowArea() const{ cout << "矩形面积:" << height * width << endl; }};class Square: public Shape{private:double length;public:Square(double a): length(a){ sum += length * length; }void ShowArea() const{ cout << "正方形面积:" <<length * length << endl; } };double Shape::sum = 0;int main(void){Shape *shape[NUM];int count = 0;while (count < NUM){cout << "请选择(1.圆形2.矩形3.正方形4.退出):";int select;cin >> select;if (select == 4) break;switch (select){case 1:double r;cout << "输入半径:";cin >> r;shape[count] = new Circle(r);shape[count]->ShowArea();count++;break;case 2:double h, w;cout << "输入高:";cin >> h;cout << "输入宽:";cin >> w;shape[count] = new Rectangle(h, w);shape[count]->ShowArea();count++;break;case 3:double a;cout << "输入边长:";cin >> a;shape[count] = new Square(a);shape[count]->ShowArea();count++;break;default:cout << "选择有误!"<< endl;break;}}cout << "总面积:" << Shape::sum << endl;for (int i = 0; i < count; i++) delete shape[i];system("PAUSE");return 0;}五.实验总结通过本次试验 我更深刻的理解了某些语句如何使用及结构体的优点 也能更加熟练的编写简单的程序了 我深知实践要比书本更加重要 今后还要多练习 在实践中学习。

实验三 虚函数与多态 纯虚函数(完整版)

实验三 虚函数与多态 纯虚函数(完整版)

实验三虚函数与多态、纯虚函数一.实验目的1. 在掌握继承与派生关系的基础上,进一步理解虚函数与多态性的关系,实现运行时的多态。

2. 学会定义和使用纯虚函数二、实验内容1.范例:了解"单接口,多方法"的概念。

现有称为figure的基类,存放了各二维对象(三角形、矩形和圆形三个类)的各维数据,set_dim()设置数据,是标准成员函数。

show_area()为虚函数,因为计算各对象的面积的方法是不同的。

【程序】#include < iostream >using namespace std;class figure{protected:double x,y;public:void set_dim(double i,double j=0){ x=i; y=j; }virtual void show_area(){ cout<<"No area computation defined for this class.\n";}};class triangle:public figure{void show_area(){ cout<<"Triangle with height "<< x<<" and base "<< y<<" has an area of "<< x*0.5*y<< endl;}};class square:public figure{public:void show_area(){ cout<<"Square with dimensions "<< x<<" and "<< y<<" has an area of "<< x*y<< endl;}};class circle:public figure{public:void show_area(){ cout<<"Circle with radius "<< x<<" has an area of "<<3.14159*x*x<< endl;}};int main(){figure *p;triangle t;square s;circle c;p->set_dim(10.0,5.0);p->show_area();p=&s;p->set_dim(10.0,5.0);p->show_area();p=&c; p->set_dim(10.0);p->show_area();return 0;}【要求】(1)建立工程,录入上述程序,调试运行并记录运行结果。

实验6 多态性与虚函数

实验6 多态性与虚函数

实验6 多态性与虚函数
实验6 多态性与虚函数
6.1 实验目的
1 .理解多态性的概念;
2 .掌握虚函数的作用及使用方法;
3 .了解静态关联和动态关联的概念和用法;
4 .了解纯虚函数和抽象类的概念和用法。

6.2 实验内容
程序设计部分
1 、定义平面图形的抽象基类figure,然后派生出四种几何图形是:三角形
/Triangle、矩形/Rectangle、正方形/Square和圆/Circle,利用基类指针和虚函数的多
态性来计算四种几何图形的面积和周长,这几何图形的参数通过构造函数来设置。

2 、定义立体图形的抽象基类shape,然后派生出:球、圆柱和圆锥,利用基类的引
用和虚函数的多态性来计算它们的表面积和体积。

本课程复习要点: 1、有关概念和知识点
变量的作用域和生存期,引用,常量,内联函数,函数重载,动态内存分配,输入/
输出流;类与对象,构造函数,拷贝构造函数,析构函数,友元;类成员的访问控制属性,this指针,静态成员,成员对象;派生/继承,多继承,构造函数调用顺序,虚基类;多态性与虚函数,抽象基类,运算符重载。

2、几个较完善的C++教学参考电子文档
3、练习:《C++程序设计基础与实践教程》习题解答、每个实验中的题目
感谢您的阅读,祝您生活愉快。

实验6 多态性与虚函数

实验6     多态性与虚函数

实验6 多态性与虚函数一.实验目的1.了解多态的概念;2.了解静态联编和动态联编的概念;3.掌握动态联编的条件;4.了解虚函数的用途及使用方法。

二源程序#include<iostream>using namespace std;class Shape{public:virtual double area()const=0;virtual void display()=0;};class TwoDimShape:public Shape{};class ThreeDimShape:public Shape{};class Circle:public TwoDimShape{public:Circle(double r){R=r;}double area()const{return 3.14*3.14*R;}void display(){cout<<"圆的面积为:"<<area()<<endl;}private:double R;};class Cube:public ThreeDimShape{public:Cube(double l){L=l;}double area()const{return 6*L*L;}void display(){cout<<"立方体的表面积为:"<<area()<<endl;} private:double L;};int main(){int i;Circle Ci1(5.2);Cube Cu1(3.3);Shape *S1[2]={&Ci1,&Cu1};for(i=0;i<2;i++){S1[i]->area();S1[i]->display();}return 0;}三.编程思想圆和立方体不属于同一类,这两类的参数不同计算方法不同,但是所求的都是面积输出的也都是面积这一个相同的成员函数。

实验四 虚函数与多态性

实验四 虚函数与多态性

实验四虚函数与多态性实验目的和要求 :1 了解多态性在 C++ 中的体现。

2 掌握虚函数的应用。

3 了解抽象类。

实验内容:定义一个基类为哺乳动物类Mammal,其中有数据成员年龄、重量、品种,有成员函数move()、speak()等,以此表示动物的行为。

由这个基类派生出狗、猫、马、猪等哺乳动物,它们有各自的行为。

编程分别使各个动物表现出不同的行为。

要求如下:1、从基类分别派生出各种动物类,通过虚函数实现不同动物表现出的不同行为。

2、今有狗: CAIRN:3岁,3kg;DORE:4岁,2kg;猫: CAT:5 岁,4kg;马: HORSE,5岁,60kg;猪: PIG,2岁,45kg。

3、设置一个 Mammal 类数组,设计一个屏幕菜单,选择不同的动物或不同的品种,则显示出动物相对应的动作,直到选择结束。

4、对应的动作中要先显示出动物的名称,然后显示年龄、重量、品种、叫声及其他特征。

实验原理:1.多态性:多态是指同样的消息被不同类型的对象接受时导致不同的行为,所谓消息是指对类的成员函数的调用,而不同的行为是指不同的实现,也就是调用不同的函数。

多态性从实现的角度来讲可以划分为两类:编译时的多态性和运行时的多态性。

编译时的多态性是在编译的过程中确定同名操作的具体操作对象,也就是通过重载函数来实现的。

运行时的的多态性是在程序运行过程中才动态地确定操作所针对的具体对象,使用虚函数来实现的。

2.虚函数:虚函数是重载的另一种形式,它提供了一种更为灵活的多态性机制。

虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是运行时才决定如何动作,即所谓的“动态连接”。

虚函数成员的定义:virtual 函数类型函数名(形参表)3.(1)抽象类:抽象类是一种特殊的类。

抽象类是为了抽象和设计的目的而建立的。

一个抽象类自身无法实例化,也就是说无法定义一个抽象类的对象,只能通过继承机制,生成抽象类的非抽象派生类,然后再实例化。

多态性与虚函数实验报告

多态性与虚函数实验报告
{
cout<<"三角形的底为:"<<width<<"高为:"<<height <<"面积为:"<<width*height/2<<endl;
}
private:
float width,height;
};
class Circle:public Base
{
public:
Circle(float r){radius = r;}
p= &obj1;
p->area();
p=&obj2;
p->area();
return 0;
}
【实验结果与数据处理】
【实验结论】
分析:用虚函数实现多态。
【实验器材】
微型计算机、Visual C++ 6.0集成软件平台
【实验步骤】
1.编辑源程序。
2.对源程序进行编译并调试程序。
3.连接并运行程序。
4.检查输出结果是否正确。程序设计如下:
#include<iostream.h>
const float PI = 3.14;
class Base
多态性与虚函数实验报告
实验题目
多态性与虚函数
日期
班级
组别
姓名
类型
【实验目的】
1.理解多态性的概念。
2.了解编译时的多态和运行时的多态。
3.掌握虚函数的定义及实现,掌握虚析构函数的使用方法。
4.了解纯虚函数和抽象类的关系及用法。
【实验原理】
设计一个基类Base,其作用是计算一个图形的面积,它只有一个公有的函数成员虚函数area。再从Base类公有派生一个三角形类Triangle和一个圆类Circle,在类Triangle和类Circle中分别定义自己的area函数,用于计算各自的面积。在主函数中设计一个Base类的对象指针,分别指向类Triangle和类Circle的对象,调用各自的area函数显示相应对象的面积。

多态性与虚函数实验报告

多态性与虚函数实验报告

多态性与虚函数实验报告实验目的:通过实验掌握多态性和虚函数的概念及使用方法,理解多态性实现原理和虚函数的应用场景。

实验原理:1.多态性:多态性是指在面向对象编程中,同一种行为或者方法可以具有多种不同形态的能力。

它是面向对象编程的核心特性之一,能够提供更加灵活和可扩展的代码结构。

多态性主要通过继承和接口来实现。

继承是指子类可以重写父类的方法,实现自己的特定行为;接口是一种约束,定义了类应该实现的方法和属性。

2.虚函数:虚函数是在基类中声明的函数,它可以在派生类中被重新定义,以实现多态性。

在类的成员函数前面加上virtual关键字,就可以将它定义为虚函数。

当使用基类指针或引用调用虚函数时,实际调用的是派生类的重写函数。

实验步骤:1. 创建一个基类Shape,包含两个成员变量color和area,并声明一个虚函数printArea(用于打印面积。

2. 创建三个派生类Circle、Rectangle和Triangle,分别继承Shape类,并重写printArea(函数。

3. 在主函数中,通过基类指针分别指向派生类的对象,并调用printArea(函数,观察多态性的效果。

实验结果与分析:在实验中,通过创建Shape类和派生类Circle、Rectangle和Triangle,可以实现对不同形状图形面积的计算和打印。

当使用基类指针调用printArea(函数时,实际调用的是派生类的重写函数,而不是基类的函数。

这就是多态性的实现,通过基类指针或引用,能够调用不同对象的同名函数,实现了对不同对象的统一操作。

通过实验1.提高代码的可扩展性和灵活性:通过多态性,可以将一类具有相似功能的对象统一管理,节省了代码的重复编写和修改成本,增强了代码的可扩展性和灵活性。

2.简化代码结构:通过虚函数,可以将各个派生类的不同行为统一命名为同一个函数,简化了代码结构,提高了代码的可读性和维护性。

3.支持动态绑定:通过运行时的动态绑定,可以根据对象的实际类型来确定调用的函数,实现了动态绑定和多态性。

实验九 多态性与虚函数

实验九 多态性与虚函数

实验九多态性与虚函数一、实验要求1.领悟面向对象编程技术的多态性特征。

2.熟练掌握虚函数的设计和使用。

二、实验内容1.定义一个类A,有两个add成员函数,参数是数字类型,就为加法;参数是字符类型,就为字符转化为字符串,并实现连接,请用程序实现。

2. 有一个汽车类vehicle,将它作为基类派生类小车类car、卡车类truck和轮船类boat,定义这些类并定义一个虚函数用来显示各类信息。

三、实验小结#include <iostream>using namespace std;class vehicle{public:virtual void pr(){cout<<"this is a vehicle"<<endl;}};class Car:public vehicle{public:void pr(){cout<<"this is a car"<<endl;}};class truck:public vehicle{public:void pr(){cout<<"this is a truck"<<endl;} };class boat:public vehicle{public:void pr(){cout<<"this is a boat"<<endl;} };void main(){vehicle *p1 = new Car;p1->pr();vehicle *p2 = new truck;p2->pr();vehicle *p3 = new boat;p3->pr();vehicle *p4 = new vehicle;p4->pr();delete p1;delete p2;delete p3;delete p4;}#include<iostream>using namespace std;class Vehicle{public:virtual void pr()=0; protected:char Name[20];};class Car:public Vehicle{public:Car(char *name){strcpy(Name,name);}void pr(){cout<<Name<<endl;}};class Truck:public Vehicle{public:Truck(char *name){ strcpy(Name,name); }void pr(){cout<<Name<<endl;}};class Boat:public Vehicle{public:Boat(char *name){ strcpy(Name,name); }void pr(){cout<<Name<<endl;}};void main(){Vehicle *vp;Car car("奔驰");Truck truck("运输卡车");Boat boat("游艇");vp=&car;vp->pr ();vp=&truck;vp->pr ();vp=&boat;vp->pr ();}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
area。再从 Base 类公有派生一个三角形类 Triangle 和一个圆类 Circle,在类 Triangle 和类 Circle 中分别定义自己的 area 函数,用于计算各自的面积。在主函数中设计一个 Base 类的 对象指针,分别指向类 Triangle 和类 Circle 的对象,调用各自的 area 函数显示相应对象的 面积。 分析:用虚函数实现多态。 【实验器材】
【实验结论】
2
微型计算机、Visual C++ 6.0 集成软件平台
【实验步骤】
1.编辑源程序。 2.对源程序进行编译并调试程序。 3.连接并运行程序。 4.检查输出结果是否正确。程序设计如下: #include<iostream.h> const float PI = 3.14; class Base {
public: virtual void area(){ cout<<"Base 中无实在面积输出!"<<endl;} }; class Triangle:public Base { public:
多态性与虚函数实验报告
实验题目
多态性与虚函数
日期
班级
组别
姓名
类型
【实验目的】
1.理解多态性的概念。
2.了解编译时的多态和运行时的多态。
3.掌握虚函数的定义及实现,掌握虚析构函数的使用方法。
4.了解纯虚函数和抽象类的关系及用法。
【实验原理】 设计一个基类 Base,其作用是计算一个图形的面积,它只有一个公有的函数成员虚函数
Triangle(float w,float h){width = w;height = h;} void area()
1
{ cout<<"三角形的底为:"<<width<<"高为:"<<height <<"面积为:"<<width*height/2<<endl; } private: float width,height; }; class Circle:public Base { public:
Circle(float r){radius = r;} void area() {
cout<<"圆形的半径为:"<<radius <<" 面 积 为 :"<<PI*radius*radius<<endl; } private: float radius; }; int main() { Base * p; Triangle obj1(2.0,3.0); Circle obj2(1.0); p= &obj1; p->area(); p=&obj2; p->area(); return 0; } 【实验结果与数据处理】
相关文档
最新文档