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...