多态性与虚函数实验报告
实验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、掌握初始化基类成员的方法。
3、掌握派生类对基类的继承。
4、学习虚函数和纯虚函数的定义与使用方式。
5、理解抽象类的概念,学习如何用指针指向其他的派生类,实现多态性。
6、掌握抽象类的定义与使用方式,并注意指针的用法。
7、学习如何使用虚函数、纯虚函数、抽象类和实现类的多态性。
二、实验设备与平台实验设备要求每个学生一台电脑,其中运行环境为VC++ 6.0系统或新版。
三、实验内容与步骤实验:编写一个人员信息管理系统。
这个系统的功能是:交互式地实现校园人员信息的录入与显示。
分析:学校里,主要有四类人员:大学本科学生、教师、研究生和助教。
大学本科生每周有固定的学时数。
教师除了固定的学时数外,还有每周的教学时数。
研究生除了固定的学时数外,每周还可以自由做一定的研究。
助教除了上课外,还要做研究和一定的教学工作。
人员的基本信息包括姓名、编号、性别、身份证号、总学时数、以及每周固定学时数。
各个人员之间的关系:people类派生出student类和teacher类,student类派生出graduate 类,graduate类和teacher类派生出TA类。
以下给出部分程序:#include <iostream>using namespace std;class people{public://添加程序private:};class student: virtual public people{public://添加程序private:};class teacher: virtual public people{public://添加程序private:};class graduate: virtual public student {public://添加程序private:};class TA: public graduate, public teacher {public://添加程序private:};void main(){//添加程序}。
实验四 类的多态性与虚函数
Circle(int r);
~Circle();
void PrintArea();
};
Circle::Circle(int r){
Area(r);
}
Circle::~Circle(){
cout<<"This is Cicle Destruction"<<endl;
}
void Circle::PrintArea(){
(4)程序格式规范,程序运行正确;
(5)认真书写实验报告,如实填写各项实验内容。
实验步骤:(1)启动Visual C++6.0开发环境;
(2)创建一个项目;
(3)建立C++源程序文件;
(4)编辑C++源程序文件内容;
(5)建立并运行可执行程序,并分析结果;
(6)关闭工作空间。
思考题:虚函数的作用是什么?、
{
Area(d,h);
}
Triangle::~Triangle(){
cout<<"Triangle析构函数"<<endl;
}
void Triangle::PrintArea(){
cout<<"三角形的面积是:"<<(m_nX*m_nY)/2<<endl;
}
//圆形
class Circle:public Shape{
~Cylinder();
void PrintArea();
};
Cylinder::Area(int r,int h){
rad=r;
height=h;
多态性和虚函数 实验报告
多态性和虚函数实验报告淮海工学院计算机科学系实验报告书课程名:《 C++程序设计(二)》题目:多态性和虚函数班级:学号:姓名:评语:成绩:指导教师:批阅时间:年月日 C++程序设计实验报告1、实验内容或题目(1)声明二维坐标类作为基类派生圆的类,把派生类圆作为基类,派生圆柱体类。
其中,基类二维坐标类有成员数据:x、y坐标值;有成员函数:构造函数实现对基类成员数据的初始化、输出的成员函数,要求输出坐标位置。
派生类圆类有新增成员数据:半径(R);有成员函数:构造函数实现对成员数据的初始化、计算圆面积的成员函数、输出半径的成员函数。
派生圆柱体类新增数据有高(H);新增成员函数有:构造函数、计算圆柱体体积的函数和输出所有成员的函数。
请完成程序代码的编写、调试。
(2)教材393页7-8题。
(3)教材416页1、4、5题。
2、实验目的与要求(1)理解继承与派生的概念(2)掌握通过继承派生出一个新的类的方法(3)了解多态性的概念(4)了解虚函数的作用与使用方法3、实验步骤与源程序⑴ 实验步骤先定义一个基类point,及其成员函数,然后以public的继承方式定义子类circle,再定义一个派生类cylinder,最后在main主函数中定义类对象,调用函数实现其功能。
先定义一个基类A及其重载的构造函数,然后以Public派生出子类B,再定义其构造函数,最后在main主函数中定义类对象,调用成员函数实现其功能。
⑵ 源代码1.#include class Point { public:Point(float=0,float=0); void setPoint(float,float); float getX() const {return x;}C++程序设计实验报告float getY() const {return y;}friend ostream & operator<protected: };Point::Point(float a,float b) {x=a;y=b;}void Point::setPoint(float a,float b) {x=a;y=b;}ostream & operator<class Circle:public Point { public:Circle(float x=0,float y=0,float r=0); void setRadius(float); float getRadius() const; float area () const;friend ostream &operator<protected: };Circle::Circle(float a,float b,float r):Point(a,b),radius(r){}float radius;C++程序设计实验报告void Circle::setRadius(float r) {radius=r;}float Circle::getRadius() const {return radius;}float Circle::area() const {return 3.14159*radius*radius;}ostream &operator<cout<class Cylinder:public Circle { public:Cylinder (float x=0,float y=0,float r=0,float h=0); void setHeight(float); float getHeight() const; float area() const; float volume() const;friend ostream& operator<r=\protected: };Cylinder::Cylinder(float a,float b,float r,floath):Circle(a,b,r),height(h){}float height;C++程序设计实验报告void Cylinder::setHeight(float h){height=h;}float Cylinder::getHeight() const {return height;}float Cylinder::area() const{return 2*Circle::area()+2*3.14159*radius*height;}float Cylinder::volume() const {return Circle::area()*height;}ostream &operator<cout<<int main() {Cylinder cy1(3.5,6.4,5.2,10);cout<感谢您的阅读,祝您生活愉快。
实验8 多态--虚函数
实验八多态—虚函数实验目的:1.学习为什么要使用虚函数。
2.学习如何声明函数为虚函数。
3.学习如何声明异类数组(类型为基类指针,指针分别指向不同的子类对象)。
4.学习如何使用虚函数和异类数组实现多态调用。
实验内容(与实验六相同):创建一个银行账户的继承层次,表示银行的所有客户账户。
所有的客户都能在他们的银行账户存钱,取钱,但是账户也可以分成更具体的类型。
例如,一方面存款账户SavingsAccount依靠存款生利,另一方面支票账户CheckingAccount 对每笔交易(即存款或取款)收取费用。
创建一个类层次,以Account作为基类,SavingsAccount和CheckingAccount 作为派生类。
基类Account应该包括一个double类型的数据成员balance,表示账户的余额。
该类应当提供三个成员函数。
成员函数credit可以向当前余额加钱;成员函数debit负责从账户中取钱,并且保证账户不会被透支。
如果提取金额大于账户金额,函数将保持balance不变,并打印信息“Debit amount exceeded account balance”;成员函数getBalance则返回当前balance的值。
派生类SavingsAccount不仅继承了基类Account的功能,而且还应提供一个附加的double类型数据成员interestrate表示这个账户的比率(百分比)。
SavingsAccount的构造函数应接受初始余额值和初始利率值,还应提供一个public成员函数calculateInterest,返回代表账户的利息的一个double值,这个值是balance和interestrate的乘积。
注意:类SavingsAccount应继承成员函数credit 和debit,不需要重新定义。
派生类CheckingAccount不仅继承了基类Account的功能,还应提供一个附加的double类型数据成员表示每笔交易的费用。
实验三 虚函数与多态 纯虚函数(完整版)
实验三虚函数与多态、纯虚函数一.实验目的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)建立工程,录入上述程序,调试运行并记录运行结果。
C实验报告-实验5多态性与虚函数
实验5 多态性与虚函数一、实验目的和要求了解静态联编和动态联编的概念。
掌握动态联编的条件。
二、实验内容和原理事先编写好程序,上机调试和运行程序,分析结果。
(1)实验指导书P96 1~4任选一题。
(2)实验指导书P100 5~6任选一题。
三、实验环境联想计算机,Windows XP操作系统,Visual C++ 6.0四、算法描述及实验步骤(1)编写源程序。
(2)检查程序有无错误(包括语法错误和逻辑错误),有则改之。
(3)编译和连接,仔细分析编译信息,如有错误应找出原因并改正之。
(4)运行程序,分析结果。
(5)将调试好的程序保存在自己的用户目录中,文件名自定。
五、调试过程12六、实验结果15七、总结动态联编需要满足3个条件,首先类之间满足类型兼容规则;第二是要声明虚函数;第三是要由成员函数来调用或者是通过基类指针、引用来访问虚函数。
附录:1.public:virtual void f(float x){cout<<"Base::f(float)"<<x<<endl;} void g(float x){cout<<"Base::g(float)"<<x<<endl;}void h(float x ){cout<<"Base::h(float)"<<x<<endl;} };class Derived:public Base{public:virtual void f(float x){cout<<"Derived::h(float)"<<x<<endl;}};int main(){Derived d;Base * pb=&d;Derived *pd=&d;pb->f(3.14f);pb->f(3.14f);pb->g(3.14f);pb->h(3.14f);pb->h(3.14f);return 0;}2#include<iostream>using namespace std;#include<string>class Teacher{public:Teacher(string n,int h);virtual double salary()=0;virtual void print()=0;protected:string name;int lessons;};Teacher::Teacher(string n,int h){name=n;lessons=h;}class Professor:public Teacher{public:Professor(string n,int h):Teacher(n,h){}double salary(){return 5000 + 50 * lessons;}void print();void Professor::print(){cout<<name<<"\tProfessor\t\t"<<lessons<<"lessons"; cout<<"\tearned ¥"<<salary()<<endl;}class Associateprofessor:public Teacher{public:Associateprofessor(string n,int h):Teacher(n,h){}double salary(){return 3000+30*lessons;}void print();};void Associateprofessor::print(){cout<<na#include<iostream>using namespace std;#include<string>class Teacher{public:Teacher(string n,int h);virtual double salary()=0;virtual void print()=0;protected:string name;int lessons;};Teacher::Teacher(string n,int h){name=n;lessons=h;}class Professor:public Teacher{public:Professor(string n,int h):Teacher(n,h){}double salary(){return 5000 + 50 * lessons;}void print();};void Professor::print(){cout<<name<<"\tProfessor\t\t"<<lessons<<"lessons"; cout<<"\tearned ¥"<<salary()<<endl;}class Associateprofessor:public Teacher{public:Associateprofessor(string n,int h):Teacher(n,h){}double salary(){return 3000+30*lessons;}void print();};void Ass me<<"\tAssociateprofessor\t"<<lessons<<"lessons"; cout<<"\tearned ¥"<<salary()<<endl;}class Lecturer:public Teacher{public:Lecturer(string n,int h):Teacher(n,h){}double salary(){return 2000+20*lessons;}void print();};void Lecturer::print(){cout<<name<<"\tLecturer\t\t"<<lessons<<"lessons";cout<<"\tearned ¥"<<salary()<<endl;}int main(){Teacher * t[3];t[0]=new Professor("Tang XiHua",12);t[1]=new Associateprofessor("Li HanPin",16);t[2]=new Lecturer("Zhang Y ue",20);for(int i=0;i<3;i++){t[i]->print();delete t[i];}return 0;}。
实验6多态性与虚函数
[实验目的]1、了解多态性的概念;2、了解虚函数的用途及使用方法;3、了解纯虚函数和抽象类的概念和用法。
[实验要求]给出以下各实验内容的源程序代码,并把编译、运行过程中出现的问题以及解决方法填入实验报告中,按时上交。
[实验学时]2学时。
[实验内容]1、写一个程序,定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)。
利用指针、虚函数printArea()分别输出以上三者的面积,3个图形的数据在定义对象时给定。
[源程序]#include<iostream>using namespace std;class Shape{public:virtual float area()const=0;virtual void display()const=0;};class Circle:public Shape{public:Circle(double a):r(a){}virtual float area()const{return 3.14*r*r;}virtual void display()const{cout<<"圆面积"<<area()<<endl;}private:double r;};class Rectangle:public Shape{public:Rectangle(double a,double b):l(a),w(b){}virtual float area()const{return l*w;}virtual void display()const{cout<<"矩形面积"<<area()<<endl;}private:double l;double w;};class Square:public Shape{public:Square(double a):a1(a){}virtual float area()const{return a1*a1;}virtual void display()const{cout<<"正方形面积"<<area()<<endl;}private:double a1;};int main(){Circle c1(5);Rectangle r1(5,8);Square s1(2.5);Shape *p[3]={&c1,&r1,&s1};int i;double m=0.0;for (i=0;i<3;i++){p[i]->display();m=m+p[i]->area();}cout<<"总面积:"<<m<<endl;}2、定义Point(点)类,由Point类派生出Circle(圆)类,再由Circle类派生出Cylinder(圆柱体)类。
实验三 多态与虚函数
C++与数据结构实验指导书实验三多态与虚函数一、实验目的1、理解多态的概念;2、理解函数的静态联编和动态联编;3、掌握虚函数的使用方法;4、掌握抽象类的概念及使用方法。
二、实验内容虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行动态联编,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。
通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。
多态指同一个方法根据其所属的不同对象可以有不同的行为。
虚函数是C++中用于实现多态(polymorphism)的机制。
核心理念就是通过基类访问派生类定义的函数1、录入下面程序,并分析结果:#include <iostream>#include <complex>using namespace std;class Base{public:Base() {cout<<"Base-ctor"<<endl;}~Base() {cout<<"Base-dtor"<<endl;}virtual void f(int){cout<<"Base::f(int)"<<endl;}virtual void f(double){cout<<"Base::f(double)"<<endl;}virtual void g(int i=10){cout<<"Base::g()"<<i<<endl;} };class Derived : public Base{public:Derived() {cout<<"Derived-ctor" <<endl;} ~Derived(){cout<<"Derived-dtor"<<endl;}void f(complex<double>) {cout<<"Derived::f(complex)"<<endl;}void g(int i=20){cout<<"Derived::g()"<<i<<endl;}};int main(){cout<<sizeof(Base)<<endl;cout<<sizeof(Derived)<<endl;Base b;Derived d;Base *pb=new Derived;b.f(1.0);d.f(1.0);pb->f(1.0);b.g();d.g();pb->g();delete pb;return 0;}2、录入下面程序,分析运行结果:#include <iostream>using namespace std;class Base{public:Base():data(count){cout<<"Base-ctor"<<endl;++count;}~Base(){cout<<"Base-dtor"<<endl;--count;}static int count;int data;};int Base::count;class Derived : public Base{public:Derived():data(count),data1(data){cout<<"Derived-ctor"<<endl;++count;}~Derived(){cout<<"Derived-dtor"<<endl;--count;}static int count;int data1;int data;};int Derived::count=10;int main(){cout<<sizeof(Base)<<endl;cout<<sizeof(Derived)<<endl;Base* pb = new Derived[3];cout<<pb[2].data<<endl;cout<<((static_cast<Derived*>(pb))+2)->data1<<endl;delete[] pb;cout<<Base::count<<endl;cout<<Derived::count<<endl;return 0;}3、录入下面程序,分析编译错误信息。
c++实验虚函数与多态性
实验九:虚函数与多态性一.实验目的1.掌握动态联编的概念;2.掌握虚函数和纯虚函数的使用方法;3.掌握抽象类的使用。
二.实验内容设计一个计算图形面积的类库。
它的顶层是一个抽象类,并且提供相应的接口函数。
抽象基类Shape,派生出Point类、矩形Rectangle、正方形Square,Point类派生出圆形Circle。
要求:1、每个类有构造函数、析构函数,并有相应的输出语句,如:“正在构造圆形”2、能显示每个类的信息,如:输出“我是圆形”3、能计算面积、周长4、定义一个基类Shape类型的指针,实现动态多态5、动态创建一个圆形对象,赋值给基类Shape类型的指针变量,程序最后delete该指针,保证析构函数的正确调用(提示:虚析构函数)6、在主函数测试。
三.实验操作步骤1.输入源程序,编译、连接直到没有错误2.根据实验步骤,撰写实验报告四、实验要求1.复习教材中和实验相关的内容,提前编好程序。
2.整理上机结果,完成实验报告。
3.注意总结上机体会。
C++程序设计及实训198 #include <iostream>using namespace std;#include<string>class Shape{public:virtual float area()=0;virtual float longth()=0;virtual void show()=0;virtual ~Shape(){}};class Point:public Shape{protected:int x;int y;public:Point(int a=0,int b=0){x=a;y=b;cout<<"is constructing Point"<<endl;}void show(){cout<<"I am point"<<endl;}~Point(){cout<<"is destructing Point"<<endl;}float area(){return 0;}float longth(){实训2:简单C++程序设计return 0;}};class Rectangle:public Point{protected:int l;int w;public:Rectangle(int a=1,int b=1){l=a;w=b;cout<<"is constructing Rectangle"<<endl;}void show(){cout<<"I am Rectangle"<<endl;}float area(){return l*w;}float longth(){return 2*(l+w);}~Rectangle(){cout<<"is destructing Rectangle"<<endl;}};class Square:public Shape{protected:int r;public:Square(int a=1)199C++程序设计及实训200{r=a;cout<<"is constructing Square"<<endl;}void show(){cout<<"I am Square"<<endl;}float area(){return r*r;}float longth(){return 4*r;}~Square(){cout<<"is destructing Square"<<endl;}};class Circle:public Point{protected:int r;public:Circle(int a=1){r=a;cout<<"is constructing Circle"<<endl;}void show(){cout<<"I am Circle"<<endl;}float area(){return r*r*3.14;实训2:简单C++程序设计}float longth(){return 2*3.14*r;}~Circle(){cout<<"is destructing Circle"<<endl;}};int main(){Point a(1,1);Square b(2);Rectangle c(2,1);Shape *p=new Circle ;p->show();delete p;return 0;}{201。
实验五 虚函数与多态性
实验五 虚函数与多态性(4学时)[实验目的]1、 掌握运算符重载的基本方法;掌握虚函数的定义与使用方法。
2、 理解静态多态性和动态多态性;掌握使用虚函数和继承实现动态多态性的方法。
[实验内容与步骤]1、 定义Pomt 类,包含有坐标x ,y 两个成员变量,对Pomt 类重载运算符 ++(功能:坐标值x ,y 增1)和 --(功能:坐标值x ,y 减1),实现对坐标值的增减。
2、 定义一个车(vehicle )基类,有Run 、Stop 等成员函数,由此派生出自行车(bicycle )类、汽车(motorcar )类,从vehicle 和motorcar 派生出摩托车(motorcycle )类,它们都有Run 、Stop 等成员函数。
观察虚函数的作用。
3、 对实验三中的people 类重载运算符 == 和 = 。
其中,== 用于判断两个people 类对象的id 属性是否相等;= 则实现对people 类对象的赋值操作。
4、 定义矩阵类,重载运算符 + 和 *,实现对矩阵类对象的相加和相乘。
5、 定义一个类BaseFly ,该类中有一个 Fly ()函数。
再定义三个类 BirdFly 、DragonFly 和 PlaneFly ,都继承自 BaseFly ,并重载 Fly ()函数。
用各类指针调用各个类对象的 Fly ()函数,体会继承的多态性。
6、 将 BaseFly ∷Fly( ) 函数声明为 virtual ,体会虚函数在多态性中的作用。
[习题与思考题]1、 建立一个类 convert ,它含有两个私有数据成员 x 与 y ,用于表示直角坐标的位置;另外含有两个私有成员函数getr( )与 getangle( ),用于将直角坐标转换为极坐标。
重载运算符 +,使能执行convert 类对象的相加运算。
直角坐标(x ,y )转换为极坐标(r ,θ)的公式为:πθ180tan 122⨯=+=-x y y x r , 2、 创建字符串类string ,重载运算符 +,使能实现两个字符串的连接;重载运算符 =,使能实现字符串赋值。
实验报告7虚函数与多态性
实验七虚函数与多态性班级: 11511 学号: 20113051131 姓名:张文静成绩:1、实验目的(1)掌握动态联编的概念;(2)掌握虚函数和纯虚函数的使用方法;(3)掌握抽象类的使用。
2、实验内容编写满足以下条件的程序。
(1)定义一个类Basefly,该类中有一个Fly()函数。
定义3个类Birdfly、Dragonfly和Planefly,都继承自Basefly类,并重载Fly()函数。
用各类的指针调用各个类的对象的Fly()函数,体会继承中的多态性。
将Basefly::Fly()函数声明为虚函数,体会虚函数在多态性中的应用。
(2)定义一个表示学生的类XS,包括成员函数XM()、XB()和NL(),分别用来显示学生的姓名、性别和年龄,并将它们全部定义为虚函数;定义一个类CZS表示初中生,包含数据成员xm、xb和nl,分别表示初中生的姓名、性别和年龄,包括成员函数XM()、XB()和NL(),分别用来显示初中生的姓名、性别和年龄;再定义一个类GZS表示高中生和一个类DXS表示大学生,同样包含数据成员xm、xb和nl,也包括成员函数XM()、XB()和NL()。
①设计基类XS及其派生类CZS、GZS和DXS。
②分别生成CZS、GZS和DXS类的对象。
③将CZS、GZS和DXS类对象的指针赋给XS类的指针变量。
④分别用XS类的指针和引用访问成员函数XM()、XB()和NL()。
⑤分析程序运行结果。
3、实验结果编写相应程序,并调试运行。
(1)#include<iostream>using namespace std;class Basefly{public:virtual void Fly()=0;};class Birdfly:public Basefly{public:void Fly(){cout<<"Birdfly中Fly()函数被调用!"<<endl;} };class Dragonfly:public Basefly{public:void Fly(){cout<<"Dragonfly中Fly()函数被调用!"<<endl;} };class Planefly:public Basefly{public:void Fly(){cout<<"Planefly中Fly()函数被调用!"<<endl;} };void main(){Basefly *p;Birdfly b1;Dragonfly d1;Planefly p1;p=&b1;p->Fly();p=&d1;p->Fly();p=&p1;p->Fly();}运行结果:#include<iostream>#include<string>using namespace std;class XS{public:XS(string n,string s,int a){ xm=n; xb=s; nl=a; }virtual void XM()=0;virtual void XB()=0;virtual void NL()=0;protected:string xm,xb;int nl;};class CZS:public XS{public:CZS(string n,string s,int a):XS(n,s,a){}void XM(){cout<<"初中生的姓名是:"<<xm<<endl;} void XB(){cout<<"初中生的性别是:"<<xb<<endl;} void NL(){cout<<"初中生的年龄是:"<<nl<<endl;} };class GZS:public XS{public:GZS(string n,string s,int a):XS(n,s,a){}void XM(){cout<<"高中生的姓名是:"<<xm<<endl;}void XB(){cout<<"高中生的性别是:"<<xb<<endl;}void NL(){cout<<"高中生的年龄是:"<<nl<<endl;} };class DXS:public XS{public:DXS(string n,string s,int a):XS(n,s,a){}void XM(){cout<<"大学生的姓名是:"<<xm<<endl;}void XB(){cout<<"大学生的性别是:"<<xb<<endl;}void NL(){cout<<"大学生的年龄是:"<<nl<<endl;} };void main(){XS *p;CZS c1("张三","男",14);GZS g1("李四","男",17);DXS d1("王丽","女",20);p=&c1; p->XM();p=&c1; p->XB();p=&c1; p->NL();p=&g1; p->XM();p=&g1; p->XB();p=&g1; p->NL();p=&d1; p->XM();p=&d1; p->XB();p=&d1; p->NL();}运行结果:总结:。
实验七 多态性与虚函数
课程名称:面向对象程序设计实验内容:实验七继承性与多态性学院:专业班级:姓名:学号:指导教师:实验日期:实验地点:一、实验目的1、1、了解多态性的概念。
2、2、了解虚函数的作用及使用方法。
3、3、了解纯虚函数和抽象类的概念和用法。
二、实验步骤1、设计一个类层次,其中的基类为Date,它拥有一个相关数据成员及一个虚函数print,从Date类派生ShortE、MediumDate和LongDate类,Date的print函数使用日期格式:11-26-2015,ShortE的print函数使用日期格式:26-11-2015MediumDate的print函数使用日期格式:Nov.26,2015LongDate的print函数使用日期格式:November 26, 2015编写一个程序来测试各个类的print函数。
写出实验步骤、调试记录和实验结果:2、定义一个抽象类CShape,包含纯虚函数Area()(用来计算面积)。
然后派生出三角形CTriangle类、矩形CRect类、圆CCircle类,分别求其面积。
各形状的数据由构造函数来设置。
并在主函数中求出各形状的面积之和。
编写一个完整的程序。
写出实验步骤、调试记录和实验结果:三、分析与总结1、总结实验所验证的知识点。
虚函数的使用方法是:在基类用virtual声明成员函数为虚函数。
这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。
在类外定义虚函数时,不必再加virtual。
在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
带有纯虚函数的类称为抽象类:class 类名{virtual 类型函数名(参数表)=0; //纯虚函数...} 纯虚函数纯虚函数没有函数体;最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”; 这是一个声明语句,最后应有分号。
实验9 多态与虚函数
Point(){}
~Point(){cout<<"executing Point destructor"<<endl;}
};
class Circle:public Point
{public:
Circle(){}
~Circle(){cout<<"executing Ciecle destructor"<<endl;}
Chuzhong(double x,double y):x1(x),y1(y){}
virtual double sum()
{
double score;
score=x1+y1;
return score;
}
protected:
double x1,y1;
};
classGaozhong :publicChuzhong
宁夏师范学院数学与计算机科学学院
《面向对象程序设计(C++)》实验报告
实验序号:9实验项目名称:多态与虚函数
学 号
姓 名
专业Hale Waihona Puke 级2013级计算机科学与技术
实验地点
指导教师
时间
2014.6.5
一、实验目的及要求
1、理解多态性,函数重载、虚函数的相关概念;
2、掌握虚函数的定义方式和实现,能够根据要求正确使用虚函数;
(3)在基类声明函数是虚拟的,并不是实际存在的,然后再派生类中才正式定义此函数,用指针指向某一派生类对象,这样就能调用指针指向的派生类对象中的函数,而不会调研其他派生类中的函数。
【设计题目】教材P414习题12.5
实验九 多态性与虚函数
实验九多态性与虚函数一、实验要求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 ();}。
实验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++程序设计基础与实践教程》习题解答、每个实验中的题目
感谢您的阅读,祝您生活愉快。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验题 目 班级 多态性与虚函数 组别 姓名 日期 类型
【实验目的】 1.理解多态性的概念。 2.了解编译时的多态和运行时的多态。 3.掌握虚函数的定义及实现,掌握虚析构函数的使用方法。 4.了解纯虚函数和抽象类的关系及用法。 【实验原理】 设计一个基类 Base,其作用是计算一个图形的面积,它只有 一个公有的函数成员虚函数 area。再从 Base 类公有派生一个三角 形类 Triangle 和一个圆类 Circle,在类 Triangle和类 Circle 中分别 定义自己的 area 函数,用于计算各自的面积。在主函数中设计一 个 Base类的对象指针,分别指向类 Triangle 和类 Circle 的对象, 调用各自的 area 函数显示相应对象的面积。 分析:用虚函数实现多态。 【实验器材】 微型计算机、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: Triangle(float w,float h){width = w;height = h;} void area() { 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; }