国产探花免费观看_亚洲丰满少妇自慰呻吟_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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 无为县| 独山县| 罗山县| 乐亭县| 凤山县| 余干县| 临江市| 和硕县| 定日县| 睢宁县| 南川市| 灵武市| 五台县| 庄河市| 大同县| 灵丘县| 天峻县| 罗江县| 大庆市| 马尔康县| 措勤县| 松阳县| 图木舒克市| 高平市| 珠海市| 娱乐| 临颍县| 施秉县| 且末县| 布拖县| 金乡县| 株洲市| 南澳县| 南京市| 马关县| 延津县| 荔浦县| 通海县| 图们市| 泰州市| 讷河市|