C++之繼承(多重繼承+多繼承+虛繼承+虛解構函式+重定義)
多重繼承和多繼承
這個我們來講講這兩個的概念問題,一字之差,千差萬別。
多重繼承,比如有三個類,人類-士兵類-步兵類,三個依次繼承,這樣的繼承稱為多重繼承。
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
相關推薦
C++之繼承(多重繼承+多繼承+虛繼承+虛解構函式+重定義)
多重繼承和多繼承 這個我們來講講這兩個的概念問題,一字之差,千差萬別。 多重繼承,比如有三個類,人類-士兵類-步兵類,三個依次繼承,這樣的繼承稱為多重繼承。 class Person {}; class Soldier :public Person
C++:為什麼在繼承關係中,父類的解構函式最好定義為虛擬函式?
我們先來看一段簡單程式碼,A類有一個指標成員_pa,B類公有繼承了A類,然後自己有一個指標成員_pb: class A{ public: A(int x = 1) :_pa(new int(x)) {} ~A()
C++在單繼承、多繼承、虛繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容
一、本文目的與說明 1. 本文目的:理清在各種繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容。 2. 說明:雖然複製建構函式屬於建構函式的一種,有共同的地方,但是也具有一定的特殊性,所以在總結它的性質時將它單獨列出來了。
C++繼承、多型,虛成員函式(包括虛解構函式、虛複製建構函式)學習筆記
通過哺乳類派生貓、狗等學習繼承、多型中的知識點 先貼上類的程式碼 #include<iostream> enum BREED { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERAMN, LAB };//犬種 class Mam
Maven 實戰 -多模組 vs 繼承 Maven提高篇系列之(一)——多模組 vs 繼承
Maven提高篇系列之(一)——多模組 vs 繼承 這是一個Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模組 vs 繼承 Maven提高篇系列之(二)——配置Plu
C++學習:虛擬函式,純虛擬函式(virtual),虛繼承,虛解構函式
C++學習:虛擬函式,虛繼承,純虛擬函式(virtual)虛解構函式 虛擬函式 純虛擬函式 虛解構函式 虛繼承 簡介 在java這種高階語言中,有abstract和interface這兩個關鍵字.代表的是抽象類和介面,但是在C++這門語言中
Maven提高篇系列之(一)——多模組 vs 繼承
通常來說,在Maven的多模組工程中,都存在一個pom型別的工程作為根模組,該工程只包含一個pom.xml檔案,在該檔案中以模組(module)的形式宣告它所包含的子模組,即多模組工程。在子模組的pom.xml檔案中,又以parent的形式宣告其所屬的父模組,即繼承
C++類中的一些細節(過載、重寫、覆蓋、隱藏,建構函式、解構函式、拷貝建構函式、賦值函式在繼承時的一些問題)
1 函式的過載、重寫(重定義)、函式覆蓋及隱藏 其實函式過載與函式重寫、函式覆蓋和函式隱藏不是一個層面上的概念。前者是同一個類內,或者同一個函式作用域內,同名不同引數列表的函式之間的關係。而後三者是基類和派生類函式不同情況下的關係。 1.1 函式過載
從零開始學C++之虛擬函式與多型(一):虛擬函式表指標、虛解構函式、object slicing與虛擬函式、C++物件模型圖
#include <iostream>using namespace std;class CObject {public: virtual void Serialize() { cout << "CObject::Serialize ..." <&
C++學習之多型篇(虛擬函式和虛解構函式的實現原理--虛擬函式表)
通過下面的程式碼來說明: #include <iostream> #include <stdlib.h> #include <string> using namespace std; /** * 定義動物類:Animal * 成員
個人對繼承理解以及虛解構函式的理解
今天又從新研究了下繼承和過載,感覺又有新的體會。 首先是對繼承的理解,繼承簡單的說就是把基類的東西保留下來(一般都是public繼承,這樣基類中的public成員繼承過來後還是public,基類中的protected成員繼承過來後為protec
Effective C++筆記之七:為多型基類宣告virtual解構函式
應該為多型基類宣告virtual解構函式,否則容易造成記憶體洩露。 因為C++明白指出,當derived class物件經由一個base class指標被刪除,而該base class如果帶有一個non-virtual解構函式,其結果未定義一實際執行時通常發生的是物件的derived成分沒
effective c++乾貨之條款07:為多型基類宣告virtual解構函式
1. 避免記憶體洩漏 首先,我們實現一個多型: class CPeople { public: CPeople(){} virtual ~CPeople(){} }; class CChinese:public CPeople { public:
Swift -繼承、屬性、重寫父類、懶載入、解構函式
1. 新建工程命名:zhoukaojineng,建立一個類Person,在類中定義方法eat,實現列印“吃飯” 2. 建立一個繼承自Person的Teacher類,在Teacher類中定義方法teach,實現列印“上課”,呼叫其父類的eat函式 3. 建立一個類Student並繼承與Pe
單繼承派生類建構函式與解構函式順序
派生類建構函式形式: 派生類建構函式 (引數表):基類建構函式(引數表) 類物件成員1(引數表)... 類物件成員n(引數表)//只能用表示式的方式對類物件成員進行初始化 {...派生類自定義的資料成員初始化} 在派生類中,首先呼叫基類的建構函式,其次呼叫
C++ 第六章(多型性和虛擬函式)下篇(虛解構函式和純虛擬函式)
一,虛解構函式 如果用new運算子建立了臨時物件,若基類中有解構函式並且定義了一個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生:系統只執行基類的解構函式,而不執行派生類的解構函式。 #include<iostream> using
C++多型及虛解構函式
C++實現多型 多型:支援相關的物件具有不同的成員函式(但原型相同) ,並允許物件與適當的成員函式進行執行時繫結。 虛表和虛表指標介紹 當呼叫一個虛擬函式時,被執行的程式碼必須與
C++中基類的解構函式為什麼要用virtual虛解構函式【轉】
(轉自:https://blog.csdn.net/iicy266/article/details/11906457) 知識背景 要弄明白這個問題,首先要了解下C++中的動態繫結。&n
C++---之帶有virtual的解構函式概念
C++解構函式加上virtual是為了防止記憶體洩漏。 用在C++實現多型的時候,其基類要加virtual。 原因跟動態繫結有關,大家都知道,多型是通過虛擬函式實現的,而虛擬函式又是通過動態繫結實現的。 先舉個例子: class Base {
C++中抽象類以及虛/純虛、解構函式的區別與介紹
一、虛擬函式 在某基類中宣告為 virtual 並在一個或多個派生類中被重新定義的成員函式,用法格式為:virtual+函式返回型別+ 函式名(引數表) {函式體};實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。 二、純虛擬函式 純虛擬函式是一種