在單一繼承中,指向虛擬表的指針的大小總是等於void*
的大小?說,虛擬函數表指針的大小是多少?
class vft { virtual ~vft(); }
assert (sizeof(vft) == sizeof(void*));
這個斷言總是對的嗎?
在單一繼承中,指向虛擬表的指針的大小總是等於void*
的大小?說,虛擬函數表指針的大小是多少?
class vft { virtual ~vft(); }
assert (sizeof(vft) == sizeof(void*));
這個斷言總是對的嗎?
C++ ISO標準沒有提到虛擬功能表指針。編譯器可以遵循這種機制來支持運行時多態,或者可以提出任何其他甚至不涉及vptr
。它完全取決於編譯器編寫者。由於該標準沒有說明關於vptr
的任何內容,它怎麼能說它的大小?沒門。結論是:你所做的(或假設的)不被語言所保證。但是,對於編譯器而言,其可能總是爲0,即。
作爲你的編譯器的旁註,你怎麼能得出結論sizeof(vft)
將等於sizeof(vptr)
?這很可能是sizeof(vft) > sizeof(vptr)
。儘管如此,我並沒有聲稱。
不,虛擬主義是實現定義的。這是一個編譯器實現細節。
所以你不能說永遠是真的。
而且,你應該寫任何代碼(如一個在問題)不要自己,假設是開放的標準作爲一個編譯器實現細節的細節,因爲這使你的代碼不是100%的可跨編譯器&甚至可能會在一些編譯器上大幅失敗。
這是依賴於實現的。
「這個說法總是對的嗎?」取決於你的意思是「永遠」。正如其他人已經指出的那樣,這是一個實現細節,即使對於同一個編譯器的不同版本,它也可能會發生變化。 C++標準沒有提到它,所以你不能依賴它。
另一方面,我從來沒有見過一個編譯器,這不會是真的。
我有。在早期,虛擬表格仍在測試中,並且使用了其他技術。 –
除了其他人已經指出的事實,我覺得標準確實提供了一些保證。即,對於class vft { void* a, b; virtual ~vft(); }
,然後sizeof(vft) > sizeof(void*)
。我敢肯定,這個標準至少保證了虛擬功能或者沒有。
我認爲它至少是實現(編譯器)的依賴,所以並非總是如此。雖然這可能是合理的假設,但我相信你在進入vptr時會陷入危險的境地。 –
不存在虛擬表或虛擬表指針(與C++相關)。斷言這種事物的存在是沒有意義的。 –