国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++之繼承(多重繼承+多繼承+虛繼承+虛析構函數+重定義)

2019-11-06 07:44:40
字體:
來源:轉載
供稿:網友

多重繼承和多繼承 這個我們來講講這兩個的概念問題,一字之差,千差萬別。 多重繼承,比如有三個類,人類-士兵類-步兵類,三個依次繼承,這樣的繼承稱為多重繼承。

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 稷山县| 阳谷县| 巴彦县| 天门市| 朔州市| 德昌县| 军事| 安达市| 高淳县| 辽宁省| 和政县| 梅河口市| 张家港市| 安康市| 甘德县| 夏津县| 信宜市| 溧阳市| 海晏县| 嘉鱼县| 靖远县| 聊城市| 江口县| 开江县| 宜君县| 鄂伦春自治旗| 巴林左旗| 龙口市| 台中市| 铜川市| 南阳市| 九台市| 北碚区| 周宁县| 昭通市| 钟山县| 寻甸| 河西区| 古交市| 滨州市| 香格里拉县|