C++虛繼承(理解還不到位)
這是因為編譯器在進行編譯的時候,需要確定子類的函式定義,如CA::f是確定的,那麼在編譯CB、CC時還需要在編譯器的語法樹中生成CB::f,CC::f等標識,那麼,在編譯CD的時候,由於CB、CC都有一個函式f,此時,編譯器將試圖生成這兩個CD::f標識,顯然這時就要報錯了。(當我們不使用CD::f的時候,以上標識都不會生成,所以,如果去掉d.f()一句,程式將順利通過編譯)
要解決這個問題,有兩個方法:
1、重寫函式f():此時由於我們明確定義了CD::f,編譯器檢查到CD::f()呼叫時就無需再像上面一樣去逐級生成CD::f標識了;
此時CD的元素結構如下:
|CB(CA)|
|CC(CA)|
故此時的sizeof(CD) = 8;(CB、CC各有一個元素k)
2、使用虛繼承:虛繼承又稱作共享繼承,這種共享其實也是編譯期間實現的,當使用虛繼承時,上面的程式將變成下面的形式:
相關推薦
C++虛繼承(理解還不到位)
即編譯器無法確定你在d.f()中要呼叫的函式f到底是哪一個。這裡可能會讓人覺得有些奇怪,命名只定義了一個CA::f,既然大家都派生自CA,那自然就是呼叫的CA::f,為什麼還無法確定呢? 這是因為編譯器在進行編譯的時候,需要確定子類的函式定義,如CA::f是確定的,那麼在編譯CB、CC時還需要在編譯器的語法樹
C++快速入門---虛繼承(21)
C++快速入門---虛繼承(21) 通過虛繼承某個基類,就是在告訴編譯器,從當前這個類再派生出來的子類只能擁有那個基類的一個例項。 虛繼承的語法: class Teacher : virtual public Person { ... } &n
【C語言】實現對一個8bit資料(unsigned char 型別)的指定位(例如第n位)的置0或者置1操作,並保持其他位不變
請編碼實現以下功能的函式 功能:實現對一個8bit資料(unsigned char 型別)的指定位(例如第n位)的置0或者置1操作,並保持其他位不變。 函式原型:void bit_set(unsigned char *p_data,unsigned char position,int flag)
【c語言】實現對一個8bit資料(unsigned char 型別)的指定位(例如第n位)置0或者置1操作,並保持其他位不變
// 實現對一個8bit資料(unsigned char 型別)的指定位(例如第n位)置0或者置1操作,並保持其他位不變 #include <stdio.h> void bit_set(unsigned char *p_data, unsigned char
JVM虛擬機---本地接口(我還不太會)
類庫 jobject 其他 pri interface cpp 比較 con 基本類型 轉載http://www.newhua.com/2008/0328/33542_2.shtml Java本地接口(Java Native Interface (JNI))允許運行在J
C++ 虛繼承 筆記
#include <iostream> #include <iomanip> using namespace std; class X { protected: int a; public: X() { a = 1; cout << setw(3) <&
C# 除錯技巧 跳過不想除錯的程式碼,(執行但不除錯)
當你使用F11進行dubug工作時,經常會進入到一些不想進入的property或method內部。比如有下面的程式碼: public string Word { get ; set ; } 並且你
C/C++ 演算法分析與設計:貪心(今年暑假不AC)
題目描述 “今年暑假不AC?” “是的。” “那你幹什麼呢?” “看世界盃呀,笨蛋!” “@#$%^&*%...” 確實如此,世界盃來了,球迷的節日也來了,估計很多ACMer也會拋開電腦,奔向電視了。 作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,
C++虛繼承實現原理
首先給出以下繼承關係,以便描述虛繼承原理: class AAA { public: int age; }; class BBB:virtual public AAA//變為虛繼承,A變為虛基類 { }; class CCC:virtual public AAA { }
VIM基本操作(本人還不熟悉的~)
更大範圍的移動: * 當游標停留在一個單詞上,* 鍵會在檔案內搜尋該單詞,並跳轉到下一處; # 當游標停留在一個單詞上,# 在檔案內搜尋該單詞,並跳轉到上一處; (/) 移動到 前/後 句 的開始; {/}
RabbitMQ C++客戶端SimpleAmqpClient編譯總結(32以及64位)
整個過程沒有截圖,使用為我的“印象筆記”不能傳圖,所以全是以文字形式描述,各位跟蹤我的腳步,一般能走到末尾。 遇到的問題: 1、Cmake必須是2.8版本或以上 2、boost編譯方式必須是預設動態編譯庫,使用靜態庫編譯會報錯(最終我重新編譯boost庫使用完全且預設動
C++虛繼承和虛基類;虛擬函式與繼承
定義:在C++中,在定義公共基類的派生類的時候,如果在繼承方式前使用關鍵字virtual對繼承方式限定,這樣的繼承方式就是虛擬繼承,公共的基類成為虛基類。這樣,在具有公共基類的、使用了虛擬繼承方式的多個派生類的公共派生類中,該基類的成員就只有一份拷貝
C++類的繼承關係——多繼承(未重寫虛擬函式)
首先,在介紹有虛擬函式的多繼承(未重寫虛擬函式),先介紹一下以下概念。 多型:多種形態,簡單地說父類的指標或引用呼叫重寫的虛擬函式,當父類的指標或引用指向父類物件呼叫的就是父類的虛擬函式,指向子類物件時呼叫的就是是子類的虛擬函式 虛擬
c++ 虛繼承與繼承的差異
前面一篇文章,說明了在C++ 虛繼承對基類建構函式呼叫順序的影響。經過仔細推敲,發現沒有徹底說清楚虛繼承與普通繼承之間的關係。所以用下面的文字再說明一下。 首先,重複一下虛擬繼承與普通繼承的區別有: 假設derived 繼承自base類,那麼derived與base是
C++虛繼承與普通繼承的區別
虛繼承的時候在子類的物件中會多出一個叫虛類指標的大小,有的資料說這個指標指向的記憶體裡面包含了該子類的偏移量和到基類的距離。但是我跟蹤過這段記憶體,發現裡面的資料沒有規律,也找不到更多的支撐材料,權且先知道子類的物件裡面會有這麼一個東西吧。 先總結虛擬繼承中比較特殊的地方,
C++ 虛繼承與虛基類
//聯絡人:石虎 QQ:1224614774 暱稱:嗡嘛呢叭咪哄一、概念1.定義:在多重繼承下,一個基類可以在派生層次中出現多次。(派生類物件中可能出現多個基類物件)在 C++ 中,通過使用虛繼承解決這
c++虛繼承
再新增virtual void f2(){},sizeof(D) = 16不變。原因如下所示:帶有虛擬函式(大於等於1個)的類,其記憶體佈局上包含一個指向虛擬函式列表的指標(vfptr)(虛擬函式表指標),這跟該類有幾個虛擬函式無關。 (adsbygoogle = window.ad
C++虛繼承(九) --- 建構函式呼叫順序的實用之處
虛擬繼承是C++語言中一個非常重要但是又比較生僻的存在,它的定義非常簡單,但是對於理解C++的繼承機制卻是非常有用的。筆者最近學習過程中發現對C++的虛擬繼承不是很明朗,故在這裡對虛繼承做個小結。 首先說下遇到的問題吧。程式碼如下(程式碼來自於何海濤《程式設計師
Unity之SerializeField(序列化欄位)和Serializable的一點理解
[HideInInspector]表示將原本顯示在面板上的序列化值隱藏起來。 [SerializeField]表示將原本不會被序列化的私有變數和保護變數變成可以被序列化的,那麼它們在下次讀取的值就是你上次賦值的值。 1、如果a是公有的序列化變數。 (1)如果你想要
C++虛繼承的作用
C++虛繼承可以防止多重繼承產生的二義性問題。 虛繼承,就是在被繼承的類前面加上virtual關鍵字,這時被繼承的類稱為虛基類,如下面程式碼中的base類。虛繼承在多重繼承的時可以防止二義性。 class base class derived