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

合集下载

虚函数与多态性实验

虚函数与多态性实验

一.实验目的及要求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;}五.实验总结通过本次试验 我更深刻的理解了某些语句如何使用及结构体的优点 也能更加熟练的编写简单的程序了 我深知实践要比书本更加重要 今后还要多练习 在实践中学习。

虚函数

虚函数

虚函数定义虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:virtual 函数返回值类型虚函数名(形参表){ 函数体}作用虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。

以实现统一的接口,不同定义过程。

如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。

当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。

动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式:指向基类的指针变量名->虚函数名(实参表)或基类对象的引用名. 虚函数名(实参表)虚函数是C++多态的一种表现例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virturl(虚函数)。

使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。

如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virturl 函数名=0 我们把这样的函数(方法)称为纯虚函数。

如果一个类包含了纯虚函数,称此类为抽象类。

示例虚函数的实例:#include<iostream.h>class Cshape{public:void SetColor( int color) { m_nColor=color;}void virtual Display( void) { cout<<"Cshape"<<endl; }private:int m_nColor;};class Crectangle: public Cshape{public:void virtual Display( void) { cout<<"Crectangle"<<endl; } };class Ctriangle: public Cshape{void virtual Display( void) { cout<<"Ctriangle"<<endl; }};class Cellipse :public Cshape{public: void virtual Display(void) { cout<<"Cellipse"<<endl;} };void main(){Cshape obShape;Cellipse obEllipse;Ctriangle obTriangle;Crectangle obRectangle;Cshape * pShape[4]=for( int I= 0; I< 4; I++)pShape[I]->Display( );}本程序运行结果:CshapeCellipseCtriangleCrectangle所以,从以上程序分析,实现动态联编需要三个条件:1、必须把动态联编的行为定义为类的虚函数。

虚函数以及纯虚函数

虚函数以及纯虚函数

虚函数以及纯虚函数 多态性是将接⼝与实现进⾏分离;⽤形象的语⾔来解释就是实现以共同的⽅法,但因个体差异,⽽采⽤不同的策略。

虚函数和纯虚函数都是实现多态的重要⽅法。

本⽂就这两种⽅法进⾏分析以及⽐较1、虚函数在基类中声明为virtual并在⼀个或者多个派⽣类被重新定义的成员函数语法规则:virtual 函数返回类型函数名(参数表) {函数体}语法分析:虚函数的声明和定义和普通的成员函数⼀样,只是在返回值之前加⼊了关键字virtual。

在基类当中定义了虚函数,可以再⼦类中定义和基类中相同函数名、相同参数、相同返回值和不同实现体的虚函数 定义为虚函数是为了让基类函数的指针或者引⽤来指向⼦类。

#include<iostream>using namespace std;class A{public:void fun(){cout << "A::fun()..." << endl;}};class B :public A{public:void fun(){cout << "B::fun()...." << endl;}};int main(){A *a = new A; //A类指针指向A类对象a->fun();A *b = new B; //A类指针指向B类对象b->fun();delete a;delete b;return0;}分析代码:在上述代码中B为A的派⽣类,A *b=new B 是将基类的指针指向B 类对象。

输出为:显然程序没有实现我们想要的输出#include<iostream>using namespace std;class A{public:virtual void fun(){cout << "A::fun()..." << endl;}};class B :public A{public:void fun(){cout << "B::fun()...." << endl;}};int main(){A *a = new A; //A类指针指向A类对象a->fun();A *b = new B; //A类指针指向B类对象b->fun();delete a;delete b;return0;}分析:可以看出利⽤虚函数可以实现多态,也就是说实现了通过不同对象的接⼝实现了不同的功能。

多态性与虚函数实验报告

多态性与虚函数实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

虚函数和纯虚函数的作用与区别

虚函数和纯虚函数的作用与区别
纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。
class A{
protected:
void foo();//普通类函数
virtual void foo1();//虚函数
virtual void foo2() = 0;//纯虚函数
}
观点二:
虚函数在子类里面也可以不重载的;但纯虚必须在子类去实现,这就像Java的接口一样。通常我们把很多函数加上virtual,是一个好的习惯,虽然牺牲了一些性能,但是增加了面向对象的多态性,因为你很难预料到父类里面的这个函数不在子类里面不去修改它的实现
虚函数和纯虚函数的作用与区别
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数!
纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!
虚函数
引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。
class Cman
{
public:
virtual void Eat(){……};
void Move();
private:
};
class CChild : public CMan
{
public:
virtual void Eat(){……};
private:
};
CMan m_man;
CChild m_child;
//这才是使用的精髓,如果不定义基类的指针去使用,没有太大的意义
//建筑公司就可以按照你的方法去实现了,如果你不说清楚这些,可能建筑
//公司不太了解你需要楼房的特性。用纯需函数就可以很好的分工合作了
虚函数和纯虚函数区别

虚函数与纯虚函数的区别

虚函数与纯虚函数的区别

虚函数与纯虚函数的区别1. 虚函数和纯虚函数可以定义在同⼀个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),⽽只含有虚函数的类(class)不能被称为抽象类(abstract class)。

2. 虚函数可以被直接使⽤,也可以被⼦类(sub class)重载以后以多态的形式调⽤,⽽纯虚函数必须在⼦类(sub class)中实现该函数才可以使⽤,因为纯虚函数在基类(base class)只有声明⽽没有定义。

3. 虚函数和纯虚函数都可以在⼦类(sub class)中被重载,以多态的形式被调⽤。

4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的⼦类重载,⽬的是提供⼀个统⼀的接⼝。

5. 虚函数的定义形式:virtual {method body} 纯虚函数的定义形式:virtual { } = 0;在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然⽽虚函数却是动态绑定(run-time bind),⽽且被两者修饰的函数⽣命周期(life recycle)也不⼀样。

6. 虚函数必须实现,如果不实现,编译器将报错,错误提⽰为:error LNK****: unresolved external symbol "public: virtual void __thiscallClassName::virtualFunctionName(void)"7. 对于虚函数来说,⽗类和⼦类都有各⾃的版本。

由多态⽅式调⽤的时候动态绑定。

8. 实现了纯虚函数的⼦类,该纯虚函数在⼦类中就编程了虚函数,⼦类的⼦类即孙⼦类可以覆盖该虚函数,由多态⽅式调⽤的时候动态绑定。

9. 虚函数是C++中⽤于实现多态(polymorphism)的机制。

核⼼理念就是通过基类访问派⽣类定义的函数10. 多态性指相同对象收到不同消息或不同对象收到相同消息时产⽣不同的实现动作。

纯虚函数 空函数

纯虚函数 空函数

纯虚函数空函数一、纯虚函数纯虚函数是指在基类中声明但没有定义的虚函数,它的作用是为派生类提供一个接口,派生类必须实现这个函数。

纯虚函数的声明语法为:virtual 返回类型函数名(参数列表) =0;其中“=0”表示该函数为纯虚函数。

纯虚函数的特点:1.没有函数体。

在基类中声明但没有提供函数的具体实现,从而使得基类成为了抽象类,不能被实例化。

2.继承。

子类必须实现纯虚函数,否则也将成为抽象类,无法被实例化。

3.多态性。

子类中实现了基类的纯虚函数后,可以通过基类指针调用子类的实现。

1.抽象类。

基类中有至少一个纯虚函数时,该基类就成为了抽象类。

抽象类不能被实例化,只能被其他类继承和实现。

2.接口。

纯虚函数提供了一种接口,规定了子类必须实现的方法。

这种方法被称为“接口”。

让我们创建一个基类Figure,定义一个纯虚函数area(),用于计算图形的面积。

代码如下:class Figure{public:virtual double area() = 0;};class Circle : public Figure{public:Circle(double r){radius = r;}double area(){return 3.1415926 * radius * radius; // 计算圆的面积}private:double radius;};使用上述代码创建一个程序,可以通过基类指针调用子类实现的结果。

代码如下:以上程序会输出圆的面积,结果如下:Circle's area is:314.15926二、空函数空函数是指没有任何实际功能的函数,用于占位或在后续开发中替换为有用的函数。

空函数的定义语法为:void 函数名(){}1.通常没有函数体,函数体中只有一个空语句,表示不需要执行任何操作。

2.占位。

空函数可以用作占位函数来占据函数列表中的某些位置,等待日后补充功能。

3.代码兼容性。

空函数可以提高代码的兼容性,当代码需要调用某个函数时,即使函数还未完成,也可以使用空函数来代替。

纯函数与虚函数

纯函数与虚函数

纯函数与虚函数简介在计算机编程中,纯函数(Pure Function)和虚函数(Virtual Function)是两个重要的概念。

纯函数是指在相同的输入下,总是返回相同的输出,并且没有任何副作用。

而虚函数是用于实现多态的机制,可以在子类中重写父类的方法。

本文将对纯函数和虚函数进行全面、详细、完整且深入地探讨。

纯函数定义纯函数是指对于相同的输入,总是得到相同的输出,并且没有任何副作用的函数。

纯函数不依赖于外部状态,只依赖于输入参数。

它的输出只取决于输入,与外部环境无关。

特点•相同的输入总是得到相同的输出。

•不会产生任何副作用,不修改外部状态。

示例以下是一个纯函数的示例:int square(int n) {return n * n;}这个函数接受一个整数作为输入,并返回它的平方。

无论何时调用这个函数,只要输入相同,输出就会相同。

这个函数没有任何副作用,不会修改任何外部状态。

优点纯函数具有以下优点: 1. 易于测试和调试:由于纯函数不依赖于外部状态,其行为仅取决于输入,因此很容易编写测试用例并进行测试和调试。

2. 容易并行化:由于纯函数没有任何副作用,可以放心地将其应用于多个并发任务,而无需担心竞态条件和不确定的结果。

3. 更易于理解和维护:纯函数的行为仅取决于输入参数,因此更容易理解和维护。

虚函数定义虚函数是用于实现多态的机制。

在面向对象编程中,虚函数是指在基类中声明的方法,可以被子类重新定义。

通过使用虚函数,可以在运行时根据对象的实际类型调用相应的方法。

特点•在基类中声明,在子类中重写。

•可以根据对象的实际类型调用相应的方法,实现多态。

示例以下是一个使用虚函数实现多态的示例:class Animal {public:virtual void speak() {cout << "Animal speaks" << endl;}};class Dog : public Animal {public:void speak() {cout << "Dog barks" << endl;}};class Cat : public Animal {public:void speak() {cout << "Cat meows" << endl;}};int main() {Animal* animal1 = new Animal();Animal* animal2 = new Dog();Animal* animal3 = new Cat();animal1->speak(); // 输出:Animal speaksanimal2->speak(); // 输出:Dog barksanimal3->speak(); // 输出:Cat meowsreturn 0;}在上面的示例中,Animal 是一个基类,它有一个名为 speak 的虚函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三虚函数与多态、纯虚函数一.实验目的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{public: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=&t;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)建立工程,录入上述程序,调试运行并记录运行结果。

(2)修改上述程序,将virtual void show_area()中的virtual去掉,重新调试运行观察结果有何变化?为什么?在不使用关键字virtual后,基类指针p对show-area的访问p->show_area()没有针对所指对象的类型调用不同的函数,而是直接根据p的类型调用了基类的成员函数show-area。

(3)修改上述程序入口函数,使其动态建立三角形、矩形和圆形3个对象,通过基类指针访问这3个对象,然后释放这3个对象。

#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{public: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 *p1; square *p2;circle *p3;p1=new triangle;p2=new square;p3=new circle;p=p1;p->set_dim(10.0,5.0); p->show_area();p=p2;p->set_dim(10.0,5.0); p->show_area();p=p3;p->set_dim(10.0); p->show_area(); delete p1; delete p2; delete p3;}(4)修改类定义中的析构函数,使之适应用户动态定义对 2、使用纯虚函数和抽象类对实验二中的题1进行改进。

#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";}//////////////////////////////////////////在此处将基类的析构函数声明为虚析构就OK了virtual ~figure(){}////////////////////////////////////};class triangle:public figure{public: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=&t;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;2、编程:自定义一个抽象类Element,提供显示、求面积等公共接口(虚函数),派生出Point、Line、Circle等图形元素类,并重新定义(override)这些虚函数,完成各自的任务。

在这里,Element是抽象基类,它不能提供具体的显示操作,应将其成员函数定义为纯虚函数。

只有采用指向基类的指针或对基类的引用进行调用,实现的才是动态绑定,完成运行时的多态性。

#include < iostream >using namespace std;const double PI=3.14159;class Element{public:virtual const char* Name() const =0;virtual double Area() const =0;};class Point:public Element{protected:double x,y;public:Point(double xv=0,double yv=0):x(xv),y(yv){}virtual const char* Name() const{return "Point";} virtual double Area() const{return 0;}};class Line:public Element{protected:double length;public:Line(double l=0):length(l){}virtual const char* Name() const{return "Line";}virtual double Area() const{return 0;}};class Circle:public Element{protected:double radius;public:Circle(double r):radius(r){}virtual const char* Name() const{return "Circle";} virtual double Area() const{return PI*radius*radius;} };void print(Element *p){cout<<p->Name()<<":\t"<<p->Area()<<endl;}int main(){Point A(1,1);print(&A);Line B(10);print(&B);Circle C(10);print(&C);return 0;}。

相关文档
最新文档