1. 程式人生 > >C++ 虛繼承與虛基類

C++ 虛繼承與虛基類

//聯絡人:石虎 QQ:1224614774 暱稱:嗡嘛呢叭咪哄


一、概念

1.定義:在多重繼承下,一個基類可以在派生層次中出現多次。(派生類物件中可能出現多個基類物件)在 C++ 中,通過使用虛繼承解決這類問題。

 * 虛繼承是一種機制,類通過虛繼承指出它希望共享其虛基類的狀態。

 * 在虛繼承下,對給定虛基類,無論該類在派生層次中作為虛基類出現多少次,只繼承一個共享的基類子物件。

 * 共享的基類子物件稱為虛基類。

2.用法:istream 和 ostream 類對它們的基類進行虛繼承。通過使基類成為虛基類,istream 和 ostream 指定,如果其他類(如 iostream 同時繼承它們兩個,則派生類中只出現它們的公共基類ios的一個副本。

3.通過在派生列表中包含關鍵字virtual 設定虛基類:

  class istream : public virtual ios { ... };

  class ostream : virtual public ios { ... };

// iostream inherits only one copy of its ios base class

 class iostream: public istream, public ostream { ... };

謝謝!!!


相關推薦

C++ 繼承

//聯絡人:石虎 QQ:1224614774 暱稱:嗡嘛呢叭咪哄一、概念1.定義:在多重繼承下,一個基類可以在派生層次中出現多次。(派生類物件中可能出現多個基類物件)在 C++ 中,通過使用虛繼承解決這

繼承的本質(介紹的非常詳細)

      虛繼承與虛基類的本質    虛繼承和虛基類的定義是非常的簡單的,同時也是非常容易判斷一個繼承是否是虛繼承的,雖然這兩個概念的定義是非常的簡單明確的,但是在C++語言中虛繼承作為一個比較生僻的但是又是絕對必要的組成部份而存在著,並且其行為和模型均表現出和一般的繼承體

C++ 鑽石繼承繼承

首先,何為鑽石繼承,顧名思義,在類的繼承過程中,繼承結構是一個類似菱形(鑽石)的結構就屬於鑽石繼承,如下: 這是一個最簡單的鑽石繼承。實際上,在複雜的繼承表中,只要子類按不同的繼承路徑回溯到基類有菱形結構,均屬鑽石繼承。下面先看一個例子,鑽石繼承在C++程式設計中帶來的問

C++ 多重繼承繼承

在派生類中對基類成員的訪問應該是唯一的。但是,在多繼承情況下,可能造成對基類中某個成員的訪問出現了不一致的情況,這時就稱對基類成員的訪問產生了二義性。 原因之一:    派生類在訪問基類成員函式時,由於基類存在同名的成員函式,導致無法確定訪問的是哪個基類的成員函式,因

C++繼承;虛擬函式繼承

定義:在C++中,在定義公共基類的派生類的時候,如果在繼承方式前使用關鍵字virtual對繼承方式限定,這樣的繼承方式就是虛擬繼承,公共的基類成為虛基類。這樣,在具有公共基類的、使用了虛擬繼承方式的多個派生類的公共派生類中,該基類的成員就只有一份拷貝

OOP2(函數/抽象/訪問控制繼承)

控制 space protected 相對 mes nbsp 獨立 friend 抽象類 通常情況下,如果我們不適用某個函數,則無需為該函數提供定義。但我們必須為每個虛函數都提供定義而不管它是否被用到了,這因為連編譯器也無法確定到底會適用哪個虛函數 對虛函數的調用可能在

13.多重繼承(菱形繼承),繼承

多重繼承: 就是一個派生類多個基類,幾乎與單繼承是一致的。 唯一考點: 菱形繼承結構(B類C類繼承A類,D類繼承A類。),產生問題,派生類有多份基類的資料。   解決辦法:B C都採用虛繼承,只有一

c++單繼承繼承(包含虛擬函式繼承的對比)

先來個概念分析題: class Person { public: void Show() { cout<<"Person::"<<_name&l

c++ 繼承繼承的差異

前面一篇文章,說明了在C++ 虛繼承對基類建構函式呼叫順序的影響。經過仔細推敲,發現沒有徹底說清楚虛繼承與普通繼承之間的關係。所以用下面的文字再說明一下。 首先,重複一下虛擬繼承與普通繼承的區別有: 假設derived 繼承自base類,那麼derived與base是

C++繼承普通繼承的區別

虛繼承的時候在子類的物件中會多出一個叫虛類指標的大小,有的資料說這個指標指向的記憶體裡面包含了該子類的偏移量和到基類的距離。但是我跟蹤過這段記憶體,發現裡面的資料沒有規律,也找不到更多的支撐材料,權且先知道子類的物件裡面會有這麼一個東西吧。 先總結虛擬繼承中比較特殊的地方,

C++繼承繼承、虛擬函式的大小問題

一、真空類 class CNull { }; 長度:1 記憶體結構: ?? 評註:長度其實為0,這個位元組作為內容沒有意義,可能每次都不一樣。 二、空類 class CNull2 { public:     CNull2(){printf("Construct

C++虛擬函式繼承繼承

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

C++ 在繼承函數、純函數、普通函數,三者的區別

pre 沒有 實例 space 自己的 img 引用 虛函數 public 源地址:http://www.cnblogs.com/xudong-bupt/p/3570304.html 1.虛函數(impure virtual)   C++的虛函數主要作用是“運行時多態”,父

C++中繼承抽象

post dog urn 針對 delet rtu 繼承 prot virt 繼承語法格式如下: class 子類名稱 : 繼承方式(public private protected 三種) 父類名稱 純虛函數格式: virtual 返回值類型 函數名(參數列表)= 0;含

C++ 多繼承繼承的記憶體佈局(Memory Layout for Multiple and Virtual Inheritance )

C++ 多繼承和虛繼承的記憶體佈局 在本文中,我們解釋由gcc編譯器實現多繼承和虛繼承的物件的佈局。雖然在理想的C++程式中不需要知道這些編譯器內部細節,但不幸的是多重繼承(特別是虛擬繼承)的實現方式有各種各樣的不太明確的結論(尤其是,關於向下轉型指標,使

繼承的概念及其作用,繼承一般繼承的區別

虛繼承是多重繼承特有的概念,這裡需要明確的是,虛繼承與虛擬函式繼承是完全不同的概念。 虛繼承是為解決多重繼承而出現的,可以節省記憶體空間 舉例: 類c4繼承自類c2和類c3,類c2繼承自類c1,類c3頁繼承自類c1。這樣類c1就出現2次,我們可以通過虛繼承節省記憶體空間,

繼承總結(重點:繼承虛擬函式)

虛繼承常考題目: 下面我們進行分析: 因為每個存在虛擬函式的類都要有一個4位元組的指標指向自己的虛擬函式表,所以每種情況的類a所佔的位元組數應該是沒有什麼問題的。  那麼類b的位元組數怎麼算呢?看“

大型程序的工具——多重繼承繼承

函數的調用 完成 完全 c++11 嵌套 基類 alt 我們 傳遞 一、多重繼承與虛繼承 1、多重繼承   在派生類的派生列表中可以包含多個基類,每個基類包含一個可選的訪問說明符。   多重繼承的派生列表也只能包含已經定義過的類,而且這些類不能是final的。對於派生類能夠

C++ 多重繼承繼承 記憶體分佈

現在考慮一下怎麼去實現從top1到left的靜態轉換,同時要想到,我們並不知道top1是否指向一個Bottom型別的物件,或者是指向一個AnotherBottom型別的物件。所以這辦不到!這個重要的偏移依賴於top1執行時的型別(Bottom則20,AnotherBottom則24)。編譯器將報錯:

python(七):元抽象

imp 匿名 exec int 上下文 增加 abstract 分割 als 一、實例創建   在創建實例時,調用__new__方法和__init__方法,這兩個方法在沒有定義時,是自動調用了object來實現的。python3默認創建的類是繼承了object。 c