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

 

最新文章

  1. android studio serialversionuid设置
  2. switch判断注意点
  3. scala-协变、逆变、上界、下界
  4. ionic 运用pouchdb/sqlite 数据库做本地存储
  5. 如何解决ajax跨域问题(转)
  6. Javascript检测用户注册信息
  7. 【安卓面试题】在一个Activity启动另一个Activity和在Service中启动一个Activity有什么区别
  8. MCM1988 问题B_lingo_装货问题
  9. 分析cocos2d-x在Android上的编译过程(1):cocco2d-x是怎样生成的Android的文件夹结构
  10. PHP学习之-Mongodb在Windows下安装及配置
  11. C# 开机自动启动程序
  12. JS中作用域
  13. slf4j 与 log4j2 基本用法
  14. windows server 2012 R2汉化 -- 玩转Microsoft Azure
  15. Android项目刮刮奖详解(一)
  16. git命令之git remote的用法
  17. linux下网卡bonding配置(转)
  18. grid的简单使用
  19. RepeatMasker
  20. 初次见识结构体与map的区别

热门文章

  1. [Java Performance] 数据库性能最佳实践 - JPA缓存
  2. clear_logs.py修改
  3. 【Demo 0006】iOS常用控件
  4. (Android) Download Images by AsyncTask API
  5. hdu 4055 Number String(有点思维的DP)
  6. Html 内嵌 选择器属性 Dom操作 JavaScript 事件
  7. 此三层非彼三层——MVC&amp;amp;UBD
  8. thinkPHP 输出及其模板调用(三)
  9. WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键
  10. [Android学习笔记]子线程更新UI线程方法之Handler