C 類的多重繼承與虛擬繼承

2021-06-13 14:42:56 字數 1792 閱讀 7892

在過去的學習中,始終接觸的單個類的繼承,但是在現實生活中,一些新事物往往會擁有兩個或者兩個以上事物的屬性,為了解決這個問題,c++引入了多重繼承的概念,

c++允許為乙個派生類指定多個基類,這樣的繼承結構被稱做多重繼承

舉個例子,交通工具類可以派生出汽車和船連個子類,但擁有汽車和船共同特性水陸兩用汽車就必須繼承來自汽車類與船類的共同屬性。

由此我們不難想出如下的圖例與**:

當乙個派生類要使用多重繼承的時候,必須在派生類名和冒號之後列出所有基類的類名,並用逗好分隔。

//站點:www.***ev-lab.com

#include

using

namespace std;

class vehicle

void setweight(int weight)

virtual

void showme() = 0;

protected:

int weight;

}; class car:public vehicle//汽車

void showme()

; class boat:public vehicle//船

void showme()

; class amphibiancar:public car,public boat//水陸兩用汽車,多重繼承的體現

void showme()

上面的**從表面看,看不出有明顯的語發錯誤,但是它是不能夠通過編譯的。這有是為什麼呢?

這是由於多重繼承帶來的繼承的模糊性

帶來的問題。

先看如下的圖示:

在圖中深紅色標記出來的地方正是主要問題所在,水陸兩用汽車類繼承了來自car類與boat類的屬性與方法,car類與boat類同為amphibiancar類的基類,在記憶體分配上amphibiancar獲得了來自兩個類的setweight()成員函式,當我們呼叫a.setweight(3)的時候計算機不知道如何選擇分別屬於兩個基類的被重複擁有了的類成員函式setweight()。

由於這種模糊問題的存在同樣也導致了amphibiancar a(4,200,1.35f);執行失敗,系統會產生vehicle」不是基或成員的錯誤。

以上面的**為例,我們要想讓amphibiancar類既獲得乙個vehicle的拷貝,而且又同時共享用car類與boat類的資料成員與成員函式就必須通過c++所提供的虛擬繼承技術來實現。

我們在car類和boat類繼承vehicle類出,在前面加上virtual關鍵字就可以實現虛擬繼承,使用虛擬繼承後,當系統碰到多重繼承的時候就會自動先加入乙個vehicle的拷貝,當再次請求乙個vehicle的拷貝的時候就會被忽略,保證繼承類成員函式的唯一性。

修改後的**如下,注意觀察變化:

//站點:www.***ev-lab.com

#include

using

namespace std;

class vehicle

virtual

void showme() = 0;

protected:

int weight;

}; class car:virtual

public vehicle//汽車,這裡是虛擬繼承

; class boat:virtual

public vehicle//船,這裡是虛擬繼承

; class amphibiancar:public car,public boat//水陸兩用汽車,多重繼承的體現

最後執行結果如下:

C 類的多重繼承與虛擬繼承

摘自 http tech.ddvip.com 2006 12 116512057312798.html 在過去的學習中,我們始終接觸的單個類的繼承,但是在現實生活中,一些新事物往往會擁有兩個或者兩個以上事物的屬性,為了解決這個問題,c 引入了多重繼承的概念,c 允許為乙個派生類指定多個基類,這樣的繼...

C 多重繼承與虛擬繼承

本文只是粗淺討論一下c 中的多重繼承和虛擬繼承。我們先來看一下簡單的例子 1 include 2 using namespace std 34 classa5 14 a 15 1617 class b publica18 27 b 28 2930 class c publica31 40 c 41 ...

c 多重繼承與模板類繼承

在很多大型系統中,c 多重繼承很多 一般是純虛函式實現介面類,多重繼承的類,都是不能定義本身物件的虛函式類,大多是純虛函式類。純虛函式類沒有成員物件,所有的類函式都是純虛函式。例如 class ia public cobject virtual int send 0 class ib public ...