因此,回到基礎,我試圖圍繞vtables和whatnot。在下面的例子中,如果我要將B*
傳遞給某個函數,那麼該函數如何知道調用C
對象的vtable中的方法,而不是來自A
的vtable的方法?是否有兩個傳遞給該對象的單獨的VTables?接口指針真的只是vtable(因爲接口,IIRC,不能包含屬性聲明)?C++多繼承和虛擬桌面
我想說的是,直到我真的試過這段代碼,我一直在假設你不能從一個接口繼承多個接口/類(並且所有的接口都有可以說是線性的),以便vtable建立在它自己之上。
如果我的虛函數表是如何工作的想法是正確(我現在知道這是不是),然後通過一個B*
,並呼籲B::OutB()
會叫A:OutA()
而不是(這顯然並非如此)。
有人可以發光嗎?
// Includes
#include <windows.h>
#include <iostream>
interface A
{
public:
virtual void OutA() = 0;
};
interface B
{
public:
virtual void OutB() = 0;
};
class C : public A, public B
{
public:
void OutA();
void OutB();
};
void C::OutA()
{
printf("Out A\n");
}
void C::OutB()
{
printf("Out B\n");
}
int main()
{
C obj;
obj.OutA();
obj.OutB();
A* ap = (A*)&obj;
B* bp = (B*)&obj;
ap->OutA();
bp->OutB();
system("pause");
// Return
return 0;
}
輸出(如預期):
Out A
Out B
Out A
Out B
維基文件GCC的虛函數表的格式,並且應該回答你的問題:HTTP: //en.wikipedia.org/wiki/Virtual_method_table#Example。 「多重繼承」部分也直接回答你的問題。 – Saul 2012-07-22 14:28:37
http://www.openrce.org/articles/files/jangrayhood.pdf「引擎蓋下的C++」是您的參考資料。看到這個問題也http://stackoverflow.com/questions/1963926/when-is-av-table-created-in-c – 2012-07-22 18:51:15
微軟有一個很好的參考,不僅詳細列出了vtables的佈局,而且還進入了所需的修復將一種類型的指針轉換爲另一種類型的指針,包括所有的邊緣情況。不幸的是,我幾年來一直無法找到它。 – 2012-07-24 15:47:00