在派生類中對基類成員的訪問應該是唯一的.但是
,在多繼承情況下
,可能造成對基類中某個成員的訪問出現了不一致的情況,
這時就稱對基類成員的訪問產生了二義性
.派生類在訪問基類成員函式時,由於基類存在同名的成員函式,導致無法確定訪問的是哪個基類的成員函式,因此出現了二義性錯誤。
例如:[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...