4 8虛基類問題的提出和初探

2021-10-24 06:26:50 字數 1643 閱讀 2036

傳統多重繼承造成的 :空間問題,效率問題,二義性問題

#include

#include

using

namespace std;

class

grand

//爺爺類

;classa1:

public grand

;classa2:

public grand

;classc1:

public a1,

public a2

;int

main()

子類物件c1的空間布局(8位元組)

虛基類,讓grand類只被繼承一次;

兩個概念:(1)虛基類表 vbtable(virtual base table).(2)虛基類表指標 vbptr(virtual base table pointer)

virtual虛繼承之後,a1,a2裡就會被編譯器插入乙個虛基類表指標,這個指標,有點成員變數的感覺

a1,a2裡因為有了虛基類表指標,因此占用了8個位元組

#include

#include

using

namespace std;

class

grand

//爺爺類

;classa1:

virtual

public grand

;classa2:

virtual

public grand

;classc1:

public a1,

public a2

;int

main()

子類24物件位元組,左到右:前2個8位元組是2個虛基類指標, m_grand,補齊

#include

#include

using

namespace std;

class

grand

//爺爺類

;classa1:

virtual

public grand

;classa2:

virtual

public grand

;classc1:

public a1,

public a2

;int

main()

a1物件空間布局:虛基類指標,m_a1,補齊,m_grand

a1父類成員m_grand放在了最後面

#include

#include

using

namespace std;

class

grand

//爺爺類

;classa1:

virtual

public grand

;classa2:

virtual

public grand

;classc1:

public a1,

public a2

;int

main()

類c1物件布局(m_grand放在了最後面),其中兩個8位元組長的是虛基類指標

虛基類 虛函式和純虛基類

首先看乙個例子 class base class child1 public base class child2 public base void main else p print 函式呼叫的時候,檢視虛表,根據p的位址首先從虛表裡面查詢要呼叫的函式 這裡呼叫child2的print 函式 ret...

虛繼承和虛基類

虛繼承主要解決在多重繼承中的菱形繼承問題,也就是說 b和c類同時繼承了a類,然後d類繼承了b,c類,那麼d類的虛表就會有重複的函式指標。include using namespace std 虛基類 class person person person string name name name e...

虛基類和虛繼承

這算得上我個人的乙個總結上,其實也算不上什麼原創,只是為了過濾一下前輩的經驗,加深一下自己的記憶 虛繼承的目的是讓某個類做出宣告,承諾願意共享它的基類,被共享的那個基類就是虛基類 includeusing namespace std class a protected int a class b p...