虛函數爲了重載和多態的需要,在基類中是有定義的,即便定義是空,所有子類中可以重寫也可以不寫基類中的函數!
純虛函數在基類中是沒有定義的,必須在子類中加以實現,很像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;
}