1. 程式人生 > >C++之繼承(多重繼承+多繼承+虛繼承+虛解構函式+重定義)

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+函式返回型別+ 函式名(引數表) {函式體};實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。 二、純虛擬函式 純虛擬函式是一種