C 虛擬繼承 虛基表的產生

2021-10-02 20:12:51 字數 1537 閱讀 1859

為什麼會有虛擬繼承

在c++中由於有了多繼承的關係,所以會產生一些特殊的繼承方式。

例如:菱形繼承

//使用d類例項化乙個物件d;

物件d的底層模型

由上圖可以看出物件d中,含有兩個_a成員變數,乙個是b類繼承於a類產生的,乙個是c類繼承於a類產生的。當執行d._a語句時,會發生編譯錯誤,由於編譯器無法知道使用者想呼叫的是哪乙個_a變數,所以會產生二義性問題,以及資料冗餘問題。

解決方法:

d.b::_a =1;

d.c::_a =2;

//無法解決資料冗餘問題。

只需要b,c虛擬繼承a即可,d繼承b、c仍然是多繼承。

為什麼虛擬繼承能夠解決上述問題呢

我們看一下菱形虛擬繼承的底層資料模型。

可以看出d物件將a物件的組成部分放在最底下,那麼b物件與c物件如何找到a物件呢?

我們發現在b,c物件部分之前分別多了乙個位址,我們對其分別取位址。

在b,c物件前面加的指標稱為虛基表指標,虛基表指標指向的表稱為虛基表,虛基表中存在兩個偏移量,第二個偏移量為與基類的偏移量,通過該偏移量可以找到基類中的資料。

C 虛基類 虛擬繼承

虛基類建構函式的引數必須由最新派生出的類負責初始化,即使不是直接繼承,示例程式的虛基類的建構函式只執行一次 include include include using namespace std class base class base1 virtual public base class bas...

虛擬繼承,虛基類

文章出處 http blog.csdn.net skylor archive 2009 03 26 4025698.aspx 虛擬繼承與虛基類實際上是說了同一件事,只是不同的書表達不同,在這裡還是推薦虛擬繼承這種說法 因為總有人問虛基類是什麼,這裡可以解釋為虛基類就是虛擬繼承,一種繼承的方式,有的書...

虛基類 虛擬繼承 虛函式?

前幾天師兄想考我什麼是虛基類的時候,我說是因為多重繼承中,如果出現菱形繼承 multiple inheritance diamond 不想要末端派生類有兩份最底層基類的資料的話,就得用虛擬繼承。結果居然被懟了,說我說的啥玩意兒?我還以為我記錯了,實際上是他把虛基類和含有虛函式的基類給混淆了。今天讀了...