掌握多重繼承和多繼承的區別。
多重繼承:
即基類a、派生類b(繼承父類a)、派生類c(c繼承父類b)。
這裡說明的是,基類a中的資料成員(前提:公有繼承方式,)會被派生類b所繼承,隱式的存放在派生類b的public下,此時派生類c公有繼承父類b,c中則包含從b和a中的公有資料成員和函式。
多繼承:
舉個例子:基類:工人類、農民類,派生類:農民工類。農民工類繼承了工人類和農民類的資料成員函式。
在專案中往往會遇到很多類,類與類之間的關係錯綜複雜,會出現多重繼承和多繼承的結合體(一種菱形關係),這就會出現乙個問題,即:資料冗餘。
舉個例子:
基類人,被派生類工人和農民所繼承,然後工人類和農民類被派生類農民工類所繼承,此時第乙個繼承關係中,工人和農民分別繼承了基類人的資料成員和函式,然後再第二個繼承關係中,農民工類繼承了來自工人類和農民類的資料成員和函式,但是工人類和農民類中存在一部分來自基類人的資料成員和函式,則就導致了農名工類中有兩份同樣的資料,造成了資料冗餘。
為了消除資料冗餘,提出虛繼承的概念。(可以解決此問題)。
即:
class worker : virtual public person
class former: virtual public person
class formerworker :public worker,public former
在看到c++繼承時,有乙個重要概念是「隱藏」,意思是基類和派生類中存在同名成員函式和資料成員,在派生類中使用它時編譯器則會自動隱藏自己定義的成員函式和資料成員,要想避開此「隱藏」,則就要引入虛函式的概念。
虛函式:
若要在派生類中使用自定義的同樣重名函式,此時基類中一成員函式則寫為: virtual void work(); 派生類中使用自定義的同樣重名函式:在宣告時寫上virtual void work();
class a
純虛函式:
一、定義
純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」
virtual void funtion1()=0
二、引入原因
1、為了方便使用多型特性,我們常常需要在基類中定義虛函式。
2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。
宣告了純虛函式的類是乙個抽象類。所以,使用者不能建立類的例項,只能建立它的派生類的例項。
純虛函式最顯著的特徵是:它們必須在繼承類中重新宣告函式(不要後面的=0,否則該派生類也不能例項化),而且它們在抽象類中往往沒有定義。
定義純虛函式的目的在於,使派生類僅僅只是繼承函式的介面。
純虛函式的意義,讓所有的類物件(主要是派生類物件)都可以執行純虛函式的動作,但類無法為純虛函式提供乙個合理的預設實現。所以類純虛函式的宣告就是在告訴子類的設計者,「你必須提供乙個純虛函式的實現,但我不知道你會怎樣實現它」。
抽象類:
含有純虛函式的類成為抽象類,
抽象類無法進行例項化。
抽象類的作用:
純虛函式的實現由派生類來實現,基類中宣告純虛函式只是派生類的介面函式。
介面類:
僅僅含有純虛函式的類稱為介面類。
繼承和純虛函式
以不同進製 輸出整數,要求抽象乙個公共基類,然後派生出 這 個子類,輸出函式print 用純虛函式實現,分別建立 進製類各乙個物件。print.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std class c...
繼承和純虛函式
純虛函式指父類中的這個虛函式是完全空白的。普通的虛函式我們需要在子類中對其進行複寫。默寫情況下我們需要子類中的子函式完全提供屬於他自己的定義而與父類中的虛函式沒什麼聯絡。當父類中採用純虛函式時,不能夠直接使用他,必須使用子類中的繼承 include include class entity clas...
虛繼承和虛函式繼承
虛繼承主要用於菱形 形式的繼承形式 虛繼承是為了在多繼承的時候避免引發歧義,比如類 有個就是a,繼承了 c也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...