詳談C 虛函式表那回事(多重繼承關係)

2022-09-03 01:48:13 字數 1587 閱讀 3275

1.無虛函式覆蓋的多重繼承:

**:

#pragma once

//無覆蓋,多重繼承

class base1

virtual void g()

virtual void h()

};class base2

virtual void g()

virtual void h()

};class base3

virtual void g()

virtual void h()

};//多重繼承無覆蓋

class derive :public base1 , public base2 , public base3

virtual void g1()

virtual void h1()

};void test()

除錯結果:

可得:1》每個父類都有虛表;

2》同樣問題,虛表中沒有體現出子類的虛函式;見真實內容:

可見子類的虛函式在按基類宣告順序的第乙個基類的虛表中,且在此基類虛函式之後;

2.有虛函式覆蓋的多重繼承:

**:

#pragma once

//有虛函式覆蓋的多重繼承

#pragma once

//無覆蓋,多重繼承

class base1

virtual void g()

virtual void h()

};class base2

virtual void g()

virtual void h()

};class base3

virtual void g()

virtual void h()

};//多重繼承無覆蓋

class derive :public base1, public base2, public base3

//唯一乙個覆蓋的子類函式

virtual void g1()

virtual void h1()

};void test()

執行結果:

其實底層是這樣的:

分析:1》每個父類的虛表中原本存放f()函式的地方,被子類的f()函式覆蓋;

2》其餘不變;(意思是,還有沒被用來覆蓋的子類虛函式,任然在首個父類虛函式表的後邊位置)

見圖:

賜教!

詳談C 虛函式表那回事(多重繼承關係)

1.無虛函式覆蓋的多重繼承 pragma once 無覆蓋,多重繼承 class base1 virtual void g virtual void h class base2 virtual void g virtual void h class base3 virtual void g virt...

詳談C 虛函式表那回事(一般繼承關係)

沿途總是會出現關於c 虛函式表的問題,今天做一總結 1.什麼是虛函式表 虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為 v table 在這個表中,主是要乙個類的虛函式的位址表,這張表解決了 繼承 覆 蓋的問題,保證其容真實反應實際的函式。...

多重繼承與虛函式表

from 一 多重繼承 1 include iostream using namespace std class b1void f1 class b2void f2 class b3void f3 class d public b1,public b2,public b3virtual void v...