多态:静态(早绑定) 在编译阶段和链接就能确定功能调用的函数。
动态(晚绑定) 在程序运行时根据需要的功能确定调用的函数。
实现晚绑定就要定义虚函数,使用虚函数则会用到基类指针。
继承基类虚成员函数的派生类,其定义的虚函数必须和基类一样(名,参数类型、顺序、个数)。
构造函数不能被继承,也不能定义为虚函数。析构函数可以定义为虚函数。
对于虚析构函数的理解请转向:https://blog.csdn.net/xld_hung/article/details/76776497
基类指针指向派生类对象,并通过基类指针调用派生类对象的虚函数,这样实现多态。
IShape.h 定义抽象类
1 #ifndef _ISHAPE_H_ 2 #define _ISHAPE_H_ 3 #include4 //---定义抽象类形状 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 #include2 #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/