多重繼承和多繼承 這個我們來講講這兩個的概念問題,一字之差,千差萬別。 多重繼承,比如有三個類,人類-士兵類-步兵類,三個依次繼承,這樣的繼承稱為多重繼承。
class Person{};class Soldier :public Person{};class Infantryman :public Soldier{};多繼承是如果一個類有多個基類,比如農民工類繼承了農民類和工人類。
class Worker{};class Farmer{};class MigrantWorker:public Worker,public Farmer{};然而在實際過程中,會出現菱形繼承的情況
如上圖所示D繼承了類B,C,類B,C都是A的派生類,既包含了多繼承,又包含了多重繼承,這就造成了我們在實例化D的時候,就會繼承兩個A的成員,造成數據的冗余,為了解決這種現象,我們引入了虛繼承的方式,即如果B和C是虛繼承A的話,那么實例化D以后,D中只有一份A的數據成員,不會冗余。
class Worker :virtual public Person// 虛基類{};class Farmer :virtual public Person{};class MigrantWorker:public Worker,public Farmer{};當我們在基類定義時機上virtual,如上面的代碼所示,繼承的農民工類實例化時,就只有一份person的數據了。
在繼承中,派生類的對象可以復制給基類,也可以用基類的指針指向派生類的對象,反之不可以。但是基類還是無法訪問子類中特有的成員函數和成員數據。如果銷毀時,只調用了基類的析構函數,而沒有調用派生類的,那么就會有一些內存沒有刪干凈。為了防止這種現象,就會用到虛析構函數。
當有繼承關系時,用父類的指針指向堆中子類對象,并且想用父類的指針來釋放掉這塊內存,那么要用到虛析構函數,那么在釋放內存時,會依次調用子類的析構函數和父類的析構函數。
class Person{public: Person();//構造函數 virtual ~Person();//析構函數 void play(); PRivate: int m_iAge; string m_strName;};重定義 重定義是指在當前的工程中,一個類被定義了兩遍,只在多個繼承類的.h文件中,多次引用了基類.h的文件,這就出現了重定義。可以通過宏定義解決重定義。
首先在公共繼承的類中增加宏定義。在菱形繼承中,宏定義必須會出現。
#ifndef PERSON_H#define PERSON_H/*******文件體************/#endif新聞熱點
疑難解答
圖片精選