理解虛基類 虛函式與純虛函式的概念

2021-05-27 12:45:51 字數 994 閱讀 6517

虛基類

在說明其作用前先看一段**

class a

;

class b:public a

大家以為這段**的輸出結果是什麼?有的人可能會馬上回答funprint of class a 與 funprint of class b 因為第一次輸出是引用類a的實 例啊,第二次輸出是引用類b的例項啊。那麼我告訴你這樣想就錯啦,答案是funprint of class a 與 funprint of class a 至於為什麼輸出 這樣的結果不在本文討論的範圍之內;你就記住,不管引用的例項是哪個類的當你呼叫的時候系統會呼叫左值那個物件所屬類的方法。比如說 上面的**類a b都有乙個funprint 函式,因為p是乙個a類的指標,所以不管你將p指標指向類a或是類b,最終呼叫的函式都是類a的funprint 函式。這就是靜態聯篇,編譯器在編譯的時候就已經確定好了。可是如果我想實現跟據例項的不同來動態決定呼叫哪個函式呢?這就須要用到 虛函式(也就是動態聯篇)

class a

在基類的成員函式前加virtual關鍵字表示這個函式是乙個虛函式,所謂虛函式就是在編譯的時候不確定要呼叫哪個函式,而是動態決定將要調 用哪個函式,要實現虛函式必須派生類的函式名與基類相同,引數名引數型別等也要與基類相同。但派生類中的virtual關鍵字可以省略,也表 示這是乙個虛函式。下面來解決一下**,宣告乙個基類的指標(必須是基類,反之則不行)p,把p指向類a的例項a,呼叫funprint函式,這 時系統會判斷p所指向的例項的型別,如果是a類的例項就呼叫a類的funprint函式,如果是b類的例項就呼叫b類的funprint函式。

純虛函式

與其叫純虛函式還不如叫抽象類,它只是宣告乙個函式但不實現它,讓派生類去實現它,其實這也很好理解。

class vehicle

;

class camion:public vehicle

{

public:

virtual void printtyre(){cout<<"camion tyre four"<

理解虛基類 虛函式與純虛函式的概念

虛基類在說明其作用前先看一段 從 中可以看出類b c都繼承了類a的ivalue成員,因此類b c都有乙個成員變數ivalue 而類d又繼承了b c,這樣類d就有乙個重名的成員 ivalue 乙個是從類b中繼承過來的,乙個是從類c中繼承過來的 在主函式中呼叫d.ivalue 因為類d有乙個重名的成員i...

理解虛基類 虛函式與純虛函式的概念

引言一直以來都沒有寫過一篇關於概念性的文章,因為我覺得這些概念性的東西書本上都有並且說的也很詳細寫來也無用,今天突發奇想想寫 一寫,下面就和大家討論一下虛基類 虛函式與純虛函式 一看名字就讓人很容易覺得混亂。不過不要緊待看完本文後你就會理解了。正文虛基類 在說明其作用前先看一段 classa cla...

C 虛基類 虛函式與純虛函式

虛基類 在說明其作用前先看一段 classa class b publica classc publica classd public b publicc void main 從 中可以看出類b c都繼承了類a的ivalue成員,因此類b c都有乙個成員變數ivalue 而類d又繼承了b c,這樣類...