虛函數

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




發佈了63 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章