1.虛函數:ios
不一樣對象面對相同的操做會體現出各自不一樣的地方ide
靜態多態:早綁定,名字相同,參數不一樣,函數重載;同一個對象接受不一樣的操做函數
1 Class Rect{ 2 3 public: 4 5 int calArea(int width); 6 7 int calArea(int width,int height); 8 9 }
動態多態:晚綁定,以封裝和繼承爲基礎,;不一樣對象下達相同的操做,產生不一樣的實現;如何體現出這個多態spa
1 class Shape{ 2 public: 3 double calcArea(){ 4 cout<<"calcArea"<<endl; 5 } 6 }; 7 8 //圓類,繼承了Shape類 9 class Circle :public Shape{ 10 public: 11 Circle(double r); 12 double calcArea(); 13 private: 14 double m_dR; 15 }; 16 double Circle::calcArea(){ 17 return 3.14*m_dR*m_dR; 18 } 19 20 //矩形類,繼承了Shape類 21 class Rect : public Shape{ 22 public: 23 Rect(double width,double height); 24 double calcArea(); 25 private: 26 m_dWidth; 27 m_dHeight; 28 }; 29 double Rect:: caclArea(){ 30 return m_dWidth* m_dHeight; 31 } 32 33 int main(void){ 34 Shape *shape1 = new Circle(4.0);//打印的是calcArea 35 Shape *shape2 = new Rect(3.0,5.0);//打印的是calcArea 36 ... 37 return 0; 38 }
1 class Shape{ 2 public: 3 Shape(); 4 virtual double calcArea();//實現多態的函數定義爲virtual函數 5 ~Shape(); 6 }; 7 Shape::Shape(){ 8 cout<<"Shape()"<<endl; 9 } 10 Shape::~Shape(){ 11 cout<<"~Shape()"<<endl; 12 } 13 double Shape:: calcArea(){ 14 cout<< "Shape->calcArea"<<endl; 15 } 16 17 class Circle:public Shape{ 18 public: 19 Circle(double r); 20 virtual double calcArea();//可加可不加,最好加 21 ~Circle(); 22 protected: 23 double m_radius; 24 }; 25 Circle::Circle(double r){ 26 m_radius = r; 27 cout<<"Circle"<<endl; 28 } 29 Circle::~Circle(){ 30 cout<<"~Circle"<<endl; 31 } 32 double Circle::calcArea(){ 33 cout<<"Circle->calcArea()"<<endl; 34 return 3.14*m_radius*m_radius; 35 } 36 37 class Rect:public Shape{ 38 public: 39 Rect(double width,double height); 40 ~Rect(); 41 virtual double calcArea();//可加可不加,最好加 42 protected: 43 double m_dWidth; 44 double m_dHeight; 45 }; 46 Rect::Rect(double width,double height){ 47 m_dWidth=width; 48 m_dHeight=height; 49 cout<<"Rect()"<<endl; 50 } 51 Rect::~Rect(){ 52 cout<<"~Rect()"<<endl; 53 } 54 double Rect::calcArea(){ 55 cout<<"Rect->calcArea()"<<endl; 56 return m_dWidth*m_dHeight; 57 } 58 59 60 //使用,注意和上面的代碼做對比 61 #include<iostream> 62 #include<stdlib.h> 63 #include"Shape.h" 64 #include"Circle.h" 65 #include"Rect.h" 66 using namespace std; 67 68 int main() 69 { 70 Shape *p1 = new Circle(2); 71 Shape *p2 = new Rect(2,3); 72 73 p1->calcArea();//調用的應該是Circle的函數 74 p2->calcArea();//調用的應該是Rect的函數 75 76 delete p1; 77 p1 = NULL; 78 delete p2; 79 p2 = NULL; 80 //Worker *p = new Worker(); 81 //delete p; 82 // p = NULL; 83 // system("pause"); 84 return 0; 85 } 86 87 /*輸出結果 88 Shape() 89 Circle 90 Shape() 91 Rect() 92 Circle->calcArea() 93 Rect->calcArea() 94 ~Shape() 95 ~Shape() 96 */