傳統多重繼承造成的 :空間問題,效率問題,二義性問題
#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...