博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【学习】C++多态机制
阅读量:4971 次
发布时间:2019-06-12

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

 

多态:静态(早绑定)  在编译阶段和链接就能确定功能调用的函数。

      动态(晚绑定)  在程序运行时根据需要的功能确定调用的函数。

 

实现晚绑定就要定义虚函数,使用虚函数则会用到基类指针。

继承基类虚成员函数的派生类,其定义的虚函数必须和基类一样(名,参数类型、顺序、个数)。

构造函数不能被继承,也不能定义为虚函数。析构函数可以定义为虚函数。

  对于虚析构函数的理解请转向:https://blog.csdn.net/xld_hung/article/details/76776497

基类指针指向派生类对象,并通过基类指针调用派生类对象的虚函数,这样实现多态。

 

 

 

 

 IShape.h     定义抽象类

1 #ifndef _ISHAPE_H_ 2 #define _ISHAPE_H_ 3 #include
4 //---定义抽象类形状 5 using namespace std; 6 //interface类 7 //---声明接口函数 8 class IShape 9 {10 public:11 virtual float getArea() = 0; //纯虚函数,获得面积12 virtual string getName() = 0; //纯虚函数,返回图形的名称13 //---声明纯虚函数的类在子类中定义函数具体的实现功能(?)14 //---抽象类不能创建对象,但可以创建自己的指针15 };16 #endif

 

 

 Circle.h

1 #ifndef CIRCLE_H 2 #define CIRCLE_H 3 #include"IShape.h" 4 //---定义圆形类 5 class CCircle : public IShape //公有继承自IShape类 6 { 7 public: 8     CCircle(float radius); //构造函数 9     virtual float getArea(); //声明两个基类的函数,声明的时候需要加virtual关键字,实现的时候就不需要加virtual关键字了。10     virtual string getName();11 private:12     float m_fRadius; //派生类可以拥有自己的成员13     //---圆的属性:半径14 };15 #endif

 

 

Rect.h

1 #ifndef RECT_H 2 #define RECT_H 3 #include"IShape.h" 4 //---定义矩形类 5 class CRect : public IShape 6 { 7 public: 8     CRect(float nWidth, float nHeight); 9     virtual float getArea();10     virtual string getName();11 private:12     float m_fWidth; //矩形类具有自己的两个属性,宽和高13     float m_fHeight;14 };15 #endif

 

Circle.cpp

1 #include"Circle.h" 2 //---实现圆形类的函数 3 CCircle::CCircle(float radius):m_fRadius(radius) //使用构造函数的初始化列表初始化 4 {} 5 //---在使用构造函数的时候将形参的值传递给圆形类的m_fRadius 6  7 float CCircle::getArea() //实现实现两个基类的函数 8 { 9     return 3.14 * m_fRadius * m_fRadius;//---求面积10 }11 12 string CCircle::getName()13 {14     return "CCircle";15 }

 

 

 

Rect.cpp

1 #include"Rect.h" 2 //---实现方形类的函数 3 CRect::CRect(float fWidth, float fHeight):m_fWidth(fWidth), m_fHeight(fHeight){} 4  5 float CRect::getArea() 6 //---定义矩形类的成员函数getArea() 7 { 8     return m_fWidth * m_fHeight;//---返回面积 9 }10 11 string CRect::getName()12 {13     return "CRect";//---返回名字14 }

 

 

 

main.cpp  

1 #include
2 #include"Rect.h" 3 #include"Circle.h" 4 5 using namespace std; 6 7 int main() 8 9 {10 int i = 0;11 IShape* pShape = NULL; 12 //定义了一个抽象类的指针,注意抽象类不能定义对象但是可以定义指针13 14 pShape = new CCircle(2.0); 15 //基类指针指向派生类的对象16 17 cout << pShape->getName() << "-" << pShape->getArea() << endl;18 //---通过基类指针调用派生类函数须使用'->'符号19 20 delete pShape; 21 //释放了CCirle对象所占的内存,但是指针是没有消失的,它现在就是一个野指针,我们在使用之前必须对它赋值22 23 pShape = new CRect(2, 1); //基类指针指向另一个派生类的对象24 cout << pShape->getName() << "-" << pShape->getArea() << endl;25 cin >> i;//---窗口一闪就没了,我就随便加了一段停一下26 return 0;27 28 }

 

原文链接:http://www.maiziedu.com/wiki/cplus/forms/

转载于:https://www.cnblogs.com/HY12345/p/9637824.html

你可能感兴趣的文章
order by/sort by/distribute by /cluster by 的区分
查看>>
Java获得屏幕分辨率
查看>>
文章标题
查看>>
当窗体获得焦点时禁用max快捷键
查看>>
Python扩展之类的魔术方法
查看>>
linux 网卡启动方法
查看>>
Jquery 父级元素、同级元素、子元素
查看>>
Git使用总结(廖雪峰git)
查看>>
BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼( dp + 矩阵快速幂 )
查看>>
vue-swiper 基于Vue2.0开发 轻量、高性能轮播插件
查看>>
ORACLE ORDER BY用法总结
查看>>
Html学习_style属性应用
查看>>
链表函数(建立,删除重复元素,排序,输出)—— 链表的有序集合
查看>>
js闭包
查看>>
聚类算法之BIRCH(Java实现)
查看>>
青蛙学Linux—Zabbix Web使用之添加一台主机
查看>>
Pod资源管理
查看>>
Metro Style App :Framwork与WinRT(一)
查看>>
[bzoj3209]花神的数论题
查看>>
字符串创建运算符#
查看>>