**:
在成員函式的形參後面寫上=0,則成員函式為純虛函式。
純虛函式宣告:
virtual 函式型別 函式名 (參數列列) = 0;
class person
;class student : public person
{};
注意:
(1)純虛函式沒有函式體;
(2)最後面的「=0」並不表示函式返回值為0,它只起形式上的作用,告訴編譯系統「這是虛函式」;
(3)這是乙個宣告語句,最後有分號。
純虛函式只有函式的名字而不具備函式的功能,不能被呼叫。
純虛函式的作用是在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對他進行定義。如果在基類中沒有保留函式名字,則無法實現多型性。
如果在乙個類中宣告了純虛函式,在其派生類中沒有對其函式進行定義,則該虛函式在派生類中仍然為純虛函式。
抽象類:
不用定義物件而只作為一種基本型別用作繼承的類叫做抽象類(也叫介面類),凡是包含純虛函式的類都是抽象類,抽象類的作用是作為乙個類族的共同基類,為乙個類族提供公共介面,抽象類不能例項化出物件。
純虛函式在派生類中重新定義以後,派生類才能例項化出物件。
總結:
1、派生類重寫基類的虛函式實現多型,要求函式名、引數列表、返回值完全相同。(協變除外)
2、基類中定義了虛函式,在派生類中該函式始終保持虛函式的特性。
3、只有類的非靜態成員函式才能定義為虛函式,靜態成員函式不能定義為虛函式。
4、如果在類外定義虛函式,只需在宣告函式時加virtual關鍵字,定義時不用加。
5、建構函式不能定義為虛函式,雖然可以將operator=定義為虛函式,但最好不要這麼做,使用時容易混淆
6、不要在建構函式和析構函式中呼叫虛函式,在建構函式和析構函式中,物件是不完整的,可能會出現未定義的行為。
7、最好將基類的析構函式宣告為虛函式。(析構函式比較特殊,因為派生類的析構函式跟基類的析構函式名稱不一樣,但是構成覆蓋,這裡編譯器做了特殊處理)
8、虛表是所有類物件例項共用的虛表剖析。
虛函式和抽象基類的應用:
#include
using
namespace
std;
//宣告抽象基類shape
class shape
virtual
void shapename()const = 0;//純虛函式
//shapenamea函式的作用是輸出具體的形狀,在派生類中定義,因此宣告為純虛函式
};//宣告point類
class point:public shape
void setpoint(float a, float b)
float getx()const
float gety()const
virtual
void shapename()const
friend ostream & operator
<
protected:
float x;
float y;
};//宣告ciircle類
class circle:public point
void setradius(float r)
float getradius()const
virtual
float area()const
virtual
void shapename()const
friend ostream & operator
<
protected:
float radius;
};int main()
執行結果:
結論:
(1)乙個基類如果包含乙個或乙個以上純虛函式,就是抽象基類。抽象基類不能也沒必要定義物件。
(2)在類的層次結構中,頂層或最上面幾層可以是抽象基類。抽象基類體現了本類族中各類的共性,把各類中共有的成員函式集中在抽象基類中宣告。
(3)抽象基類是本類族的共公共介面,即就是從同一基類中派生出的多個類有同一介面。
C 虛函式 純虛函式
1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...
C 虛函式 純虛函式
1.析構函式是否應為虛函式問題?2.成員函式的虛函式問題?3.析構函式是否可以為純虛函式問題?說明 僅在使用父類指標指向子類物件時有區別 當析構函式非虛函式時,使用父類指標指向子類物件,在析構時將不會呼叫子類析構函式 當析構函式是虛函式時,使用分類指標指向子類物件,在析構時會呼叫子類析構函式,且呼叫...
C 虛函式 純虛函式
include qdebug class animal void animal animal 即要實現基類animal的animal函式 假如在dog子類中沒有實現animal 函式,則會呼叫基類的animal 函式。即列印 what is the animal 假如在dog子類中實現了animal...