多重繼承中二義性的消除

2021-06-23 06:04:14 字數 669 閱讀 2956

類a派生b和c,   類d從b,c派生,如何將乙個類a的指標指向乙個類d的例項?

解析:這道題實際上考查的是如何消除多重繼承引起的向上繼承二義性問題。程式**如下所示:

class a {};

class b : public a {};

class c : public a {};

class d : public b, public c {};

int main()

由於b、c繼承自a,b、c都擁有a的乙份拷貝,類d多重繼承自b、c,因此擁有a的兩份拷貝,如果此時乙個類a的指標指向乙個類d的例項,會出現「模糊的轉換」之類的編譯錯誤。解決辦法如下:

class a {};

class b : virtual public a {}; //b虛擬繼承自a

class c : virtual public a {}; //c虛擬繼承自a

class d : public b, public c {};

int main()

將b、c都改為虛擬繼承自a,則類d多重繼承自b、c時,就不會重複擁有a的拷貝了,因此也就不會出現轉換錯誤了。

答案:把b、c都改為虛擬繼承自a,消除繼承的二義性。

多重繼承轉換二義性

如果乙個類繼承多個基類,而且這些基礎繼承相同的基類,則進行型別轉換時,如果轉換成相同的父型別,編譯時會產生二義性錯誤 class a class b public a class c public a class d public b,public c d pa new d a pb a pa er...

二義性 消除左遞迴

書是龍書 編譯器中常用的方法可以分為自頂向下和自底向上的。乙個是從語法分析樹的頂部開始向底部構造語法分析樹,乙個則是從葉子節點開始,逐漸向根結點構造,這兩種分析方法中,語法分析器的輸入總是照著從左向右。二義性 如果乙個文法可以為某個句子生成多棵語法分析樹,那麼他就是二義性的。例如例子id id id...

C 繼承 二義性 虛繼承

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