虛函數為了重載和多態的需要,在基類中是有定義的,即便定義是空,所有子類中可以重寫也可以不寫基類中的函數。
純虛函數在基類中是沒有定義的,必須在子類中加以實現,很像java中的介面函數。
虛函數
引入原因:為了方便使用多態特性,我們常常需要在基類中定義虛函數。
class Cman{ public: virtual void Eat(){……}; void Move(); private:};class CChild : public CMan{ public: virtual void Eat(){……}; private:};CMan m_man;CChild m_child;CMan *p ; //這才是使用的精髓,如果不定義基類的指標去使用,沒有太大的意義p = &m_man ;p->Eat(); //始終調用CMan的Eat成員函數,不會調用 CChild 的p = &m_child;p->Eat(); //如果子類實現(覆蓋)了該方法,則始終調用CChild的Eat函數//不會調用CMan 的 Eat 方法;如果子類沒有實現該函數,則調用CMan的Eat函數p->Move(); //子類中沒有該成員函數,所以調用的是基類中的
純虛函數引入原因:
1、同“虛函數”;
2、在很多情況下,基類本身產生對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身產生對象明顯不合常理。
class A{
public:
void func1(); // 普通函數
virtual void func2(); // 虛函數
virtual void func3()=0; // 純虛函數
};
#include "stdafx.h"#include <iostream>#include <string>class Graph{ protected: double x; double y; public: Graph(double x,double y); void virtual showArea();//定義為虛函數或virtual void showArea()};Graph::Graph(double x,double y){ this->x=x; this->y=y;}void Graph::showArea(){ std::cout<<"計算圖形面積"<<std::endl;}class Rectangle:public Graph{ public: Rectangle(double x,double y):Graph(x,y){}; virtual void showArea();//定義為虛函數};void Rectangle::showArea(){ std::cout<<"矩形面積為:"<<x*y<<std::endl;}class Triangle:public Graph{ public: Triangle(double d,double h):Graph(d,h){}; virtual void showArea();//定義為虛函數};void Triangle::showArea(){ std::cout<<"三角形面積為:"<<x*y*0.5<<std::endl;}class Circle:public Graph{ public: Circle(double r):Graph(r,r){}; virtual void showArea();//定義為虛函數};void Circle::showArea(){ std::cout<<"圓形面積為:"<<3.14*x*y<<std::endl;}int main(){ Graph *graph; Rectangle rectangle(10,5); graph=&rectangle; graph->showArea(); Triangle triangle(5,2.4); graph=? graph->showArea(); Circle circle(2); graph=&circle; graph->showArea(); return0;}