class human
;class man:public man
;
申請記憶體時,可以使基類指標指向其派生類的物件。
human *h = new human;
human *h = new man;
以上都是可以的。但是此指標只能呼叫基類被繼承的成員。如果基類和子類都有乙個同名函式,那麼h->func()呼叫的無論如何都是基類的func。如果想要在指標指向man物件時呼叫man的func呢,這時則需要虛函式了
class human
;class man:public man
;
當基類中的同名函式設定為virtual時,子類中無論加不加virtual都會自動變成虛函式,當然最好習慣性的加上,便於閱讀。
這時基類指標指向基類物件就呼叫的基類的func,指向子類的物件,呼叫的就是子類的func。
如果在子類的同名函式後加上override後,如果此函式宣告的和基類中不一樣,就會報錯。
如果在基類的同名函式後加上final後,如果子類有同名函式想要覆蓋此函式,則會報錯。
純虛函式:如果基類中同名函式只有宣告沒有定義,只有子類中有相應的定義,則次函式為純虛函式,同時基類也成了抽象類,無法例項化。
class human
;class man:public man
;
由於虛函式的出現,導致基類指標根據不同的物件會呼叫不同的虛函式,這裡成為執行時的動態繫結,只有執行中才能知道該呼叫哪個,也是動態多型性。靜態多型性指的是函式的過載,這在編譯過程中就知道該呼叫哪個,靜態繫結。
基類的析構函式一定要定義成虛函式,因為如果不是虛函式,當用指標開闢了指向子類物件的空間時,當delete時,只會呼叫基類的析構函式,子類的析構函式無法呼叫。會導致子類中申請空間的變數的空間無法釋放,從而記憶體洩漏
虛基類 虛函式和純虛基類
首先看乙個例子 class base class child1 public base class child2 public base void main else p print 函式呼叫的時候,檢視虛表,根據p的位址首先從虛表裡面查詢要呼叫的函式 這裡呼叫child2的print 函式 ret...
C 虛基類 虛函式與純虛函式
虛基類 在說明其作用前先看一段 classa class b publica classc publica classd public b publicc void main 從 中可以看出類b c都繼承了類a的ivalue成員,因此類b c都有乙個成員變數ivalue 而類d又繼承了b c,這樣類...
虛基類 虛函式 純虛函式講解
虛基類 在說明其作用前先看一段 從 中可以看出類b c都繼承了類a的ivalue成員,因此類b c都有乙個成員變數ivalue 而類d又繼承了b c,這樣類d就有乙個重名的成員 ivalue 乙個是從類b中繼承過來的,乙個是從類c中繼承過來的 在主函式中呼叫d.ivalue 因為類d有乙個重名的成員...