1. 程式人生 > >C++virtual 虛函數、純虛函數

C++virtual 虛函數、純虛函數

str 也不能 都是 輸出 優秀 ios image log inf

前提摘要:

虛函數聯系到多態,多態聯系到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麽都沒得談。

虛函數定義:

指向基類的指針或引用在操作它的多態類(子類/派生類)對象時,會根據不同的類對象,調用其相應的函數,這個函數就是虛函數。

使用方法:

1.只需要在成員函數聲明前使用關鍵字“virtual”將函數聲明為虛函數(子類中可加可不加,沒加系統會自動判定為虛函數,為了閱讀性,建議加上),而函數實現不需要使用關鍵字“virtual”。

2.非類的成員函數不能定義為虛函數,類的成員函數中靜態成員函數和構造函數也不能定義為虛函數,但可以將析構函數定義為虛函數。實際上,優秀的程序員常常把基類的析構函數定義為虛函數。因為,將基類的析構函數定義為虛函數後,當利用delete刪除一個指向派生類定義的對象指針時,系統會調用相應的類的析構函數。而不將析構函數定義為虛函數時,只調用基類的析構函數。

測試代碼:

#include <iostream>

using namespace std;
class A
{
public:
    A(){}
    virtual ~A(){}
    virtual void print();
};
void A::print()
{
   cout << "aaaa" << endl;
}
class B:public A
{
public:
    B(){}
    ~B(){}
    void print()
   {
      cout << "bbbb" << endl;
   }
};

int main() { A *a1 = new A; A *a2 = new B; a1->print(); a2->print(); return 0; }

輸出結果:

技術分享圖片

純虛函數:

1、純虛函數聲明如下: virtual void funtion1()=0;

2.有純虛函數的類是抽象類,不能生成對象,只能派生。

3.定義純虛函數的類不可實例化;其派生類沒有為該純虛函數定義實現方法也不可實例化;

C++\virtual 虛函數、純虛函數