博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++多态的案例分析
阅读量:6678 次
发布时间:2019-06-25

本文共 2109 字,大约阅读时间需要 7 分钟。

近期在研究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  不然默认的都是私有的派生。还有在写代码的过程中,一定要注意不要把英语字母写错,当中的一个字母错了,花了我好长时间,最后才检查出来,敲代码的前期大都会遇到这种情况的,我们须要做的就是,认真再认真。

 

转载地址:http://mpyao.baihongyu.com/

你可能感兴趣的文章
SpriteBuilder中关节的Breaking force属性
查看>>
JavaWeb学习----JSP内置对象详解
查看>>
UICollectionView二级树展开
查看>>
MFC和Win32的比较
查看>>
Linux系统及应用问题分析排查工具
查看>>
阿里十年经验输出,大数据平台“数加”的前世今生
查看>>
[华为机试练习题]20.Home+Work
查看>>
【spring框架】AOP的Annotation实现(下)
查看>>
出来混&#183;早晚都得还---旧美的再次学习
查看>>
iOS中线程Call Stack的捕获和解析(二)
查看>>
JavaScript对象和数组
查看>>
初探IMEI【译】
查看>>
关于2,3,5,7的问题
查看>>
JAVA拖拽选择文件
查看>>
MySQL · 引擎特性 · InnoDB文件系统管理
查看>>
JAVA从入门到大神(JAVA——API知识总结)
查看>>
【小程序踩坑】小程序页面pv统计数过高,导致页面转化率低
查看>>
hadoop之旅7-centerOS7 : Hive环境搭建
查看>>
数据监听进阶
查看>>
es6手写jsop实现【promise】
查看>>