您的位置:首页 > 编程语言 > C语言/C++

c++多态的案例分析

2014-11-13 19:30 309 查看
近期在研究c++中多态的应用 ,当中遇到些许的疑问与问题,可是终于的结果是不容置疑的,以下记录下我的学习过程,以纪念本个知识点。

首先,是从一个案例開始的,题目大意是这种:

设定一个多边形的公共类,然后再设定多个图形的各个派生类,最后通过基类,依据多态的应用通过基类,求出所求图形的面积

于是依据自己所学的知识,開始大致的勾画原始的雏形例如以下:

#include

using namespace std;


class Shape //基类

{

public:

virtual double area()=0;

};


int main ()

{

Circle c(5); //圆參数赋值

Rectangle r(3,4); //矩形參数赋值

Triangle t(3,4); //三角形赋值

Shape *p; //设置一个基类的指针

p=&c; //调用求圆面积的方法 求圆的面积

cout<<p->area()<<endl;

p=&r; //调用求矩形面积的方法求矩形面积

cout<<p->area()<<endl;

p=&t; //调用求三角形面积的方法求三角形的面积

cout<<p->area()<<endl;

system("pause");

return 0;

}


然后,再把一个一个的派生类,加入进去 ,效果例如以下:

#include

using namespace std;

class Shape

{

public:

virtual double area() =0;

};


class Circle: public Shape

{

public:

Circle(double r):radius(r){}

virtual double area()

{

return radius*radius*3.14159;

}

private:

double radius;

};

class Rectangle:public Shape

{

public:

Rectangle(double x,double y):x(x),y(y){}

virtual double area()

{

return x*y;

}

private:

double x,y;

};

class Triangle:public Shape

{

public:

Triangle(double x,double y):x(x),y(y){}

virtual double area()

{

return x*y/2;

}

private:

double x,y;

};

int main ()

{

Circle c(1);

Rectangle r(3,4);

Triangle t(3,4);

Shape *p;

p=&c;

cout<<p->area()<<endl;

p=&r;

cout<<p->area()<<endl;

p=&t;

cout<<p->area()<<endl;

system("pause");

return 0;

}


执行结果:

相同的道理,还能够这样子写,仅仅是每一个人的习惯不同而已,代码例如以下:

#include

using namespace std;

class shape

{

public:

virtual void area()=0;

};

class Trangle : public shape

{

protected:

double a,b;

public:

Trangle(double a,double b):a(a),b(b){};

virtual void area()

{

cout<<a*b*0.5<<endl;

}

};

class Rectangle:public shape

{

protected:

double a,b;

public:

Rectangle(double a,double b):a(a),b(b){};

virtual void area()

{

cout<<a*b<<endl;

}

};

class Circle:public shape

{

protected:

double a;

public:

Circle(double a):a(a){};

virtual void area()

{

cout<<3.14*a*a<<endl;

}

};

int main()

{

shape *p;

Trangle t(1,1);

Rectangle r(1,1);

Circle c(2);

p=&t; // 三角形面积

p->area() ;

p=&r; //矩形面积

p->area() ;

p=&c; // 圆形面积

p->area();

return 0;

}


当中须要注意的点是: 一定要写成的是公有的派生,即public 不然默认的都是私有的派生。还有在写代码的过程中,一定要注意不要把英语字母写错,当中的一个字母错了,花了我好长时间,最后才检查出来,敲代码的前期大都会遇到这种情况的,我们须要做的就是,认真再认真。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: