c 複習之多繼承的二義性

2021-08-20 17:20:39 字數 1999 閱讀 2658

在派生類中對基類成員的訪問應該是唯一的.但是

,在多繼承情況下

,可能造成對基類中某個成員的訪問出現了不一致的情況,

這時就稱對基類成員的訪問產生了二義性

.派生類在訪問基類成員函式時,由於基類存在同名的成員函式,導致無法確定訪問的是哪個基類的成員函式,因此出現了二義性錯誤。

例如:[cpp]view plain

當派生類

derived

訪問fun()

函式時,無法確定訪問的是

base1

的還是base2

的,將出現二義性錯誤。

1,使用作用域運算子指明訪問的是base1的還是base2的fun函式。

例如:obj.base1::fun();   //指明訪問base1的fun函式

2,在類中定義同名成員,使內層函式覆蓋外層的函式。

例如:[cpp]view plain

copy

classderived:public base1,public base2  

;  執行:

當乙個派生類從多個基類派生時,而這些基類又有乙個共同的基類,當對這個共同的基類中說明的成員進行訪問時,可能出現二義性問題。

例如:

base為derived11和derived12的基類,而derived2又繼承derived11和derived12,當derived2訪問base的data時,會出現二義性錯誤,**如下:

[cpp]view plain

copy

class base  

;  class derived11:public base{};  

class derived12:public base{};  

class derived2:public derived11,public derived12 {};  

int main()    1

,作用域運算子

obj.derived11::a

,指明訪問哪乙個基類的

data.

但是由於派生類的直接基類有乙個共同的基類,所以

obj.base::a

是錯誤的。

2,使用虛基類

產生二義性的最主要的原因就是

base

在派生類

derived2

中產生了

2個物件,從而導致了對基類

base

的成員data

訪問的不一致性。要解決這個問題,只需使這個公共基類

base

在派生類中只產生乙個子物件即可。

雖然在形式上,

derived2

繼承derived11,derived12

,但是在儲存結構上,對

data

的訪問是指向

base

的。

C 繼承 二義性 虛繼承

繼承 子類擁有父類所有的成員變數和函式 子類是一種特殊的父類 子類可以當做父類的物件使用 子類可以擁有父類沒有的方法和屬性。class parent class child public parent int main 繼承的訪問控制 c 中的繼承方式會影響子類對外訪問屬性 1 看呼叫語句,是在類的...

C 多繼承的二義性

單繼承 派生類只從乙個基類派生 多繼承 派生類從多個基類派生 多重派生 有乙個基類派生出多個不同的派生類 多層派生 派生類又作為基類,繼續派生出新的類 多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。多繼承下派生類的定義格式如下 c...

C 多繼承的二義性

多繼承可以看作是單繼承的擴充套件。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關係仍可看作是乙個單繼承。多繼承下派生類的定義格式如下 class 派生類名 繼承方式1 基類名1 繼承方式2 基類名2 其中,繼承方式1 繼承方式2 是三種繼承方式 public private protec...