鑄造如果你有一個void *指針指向派生類來自BaseA
和BaseB
繼承,編譯器如何鑄就void*
指針BaseA*
(或BaseB*
)不知道該void*
指針Derived
類型的?多重繼承
Q
多重繼承
6
A
回答
5
它沒有。使用static_cast
鑄造和從void*
時的唯一保證是:
類型的指針的值,以對象轉換爲「指針
cv void
」和回原始指針型將具有其原始值(C + +03§5.2.9/ 10)。
例如,下面的代碼不正確,因爲void*
被強制轉換爲比原來的指針類型之外的類型(鑄造序列是B1*
- >void*
- >B2*
):
struct B1 { int i; };
struct B2 { int j; };
struct D : B1, B2 { };
D x;
B1* b1ptr = &x;
void* voidptr = b1ptr;
B2* b2ptr = static_cast<B2*>(voidptr);
嘗試在這裏使用b2ptr
會導致未定義的行爲。 voidptr
可以安全投射的唯一類型是B1*
,因爲這是獲得void*
的類型(嗯,或者char*
,因爲任何東西都可以通過char*
訪問)。
3
編譯器不會將void*
指針強制轉換爲任何東西 - 程序員會這樣做。
爲了做什麼有用的東西有void*
指針,你需要明確它轉換到非void*
指針,如果你錯了什麼類型的指針實際指向的,你進入未定義行爲市。
相關問題
- 1. 多重繼承
- 2. 多重繼承
- 3. 多重繼承()
- 4. C++多重繼承
- 5. 多重繼承:2Classes1Method
- 6. Python的多重繼承
- 7. 多重繼承ambigious功能
- 8. 多重繼承:QGraphicsPixmapItem和QGraphicsTextItem
- 9. Objective-C多重繼承
- 10. gcc thunk hack多重繼承
- 11. Java的多重繼承ActionBarActivity
- 12. Codeigniter和多重繼承
- 13. C#多重泛型繼承
- 14. 多重繼承批評
- 15. 繼承和多重構造
- 16. 接口的多重繼承
- 17. 多重繼承層次
- 18. LINQtoSQL中的多重繼承?
- 19. 曖昧多重繼承
- 20. 多重繼承的分類?
- 21. 風格的多重繼承
- 22. wxPython和多重繼承
- 23. Ruby中的多重繼承...繼承自多個控制器類。
- 24. 使用QThread和QWidget進行多重繼承(使用QObject進行多重繼承)
- 25. 用重寫模仿多重繼承
- 26. 多重繼承和多態性
- 27. 更多C++多重繼承的樂趣
- 28. C++:多重繼承與多態性
- 29. 虛擬繼承如何解決「菱形」(多重繼承)歧義?
- 30. 多級繼承
您的回答是正確的。 從我的研究來看,如果派生擴展了BaseA和BaseB,則該對象在內存中佈置爲| BaseA | BaseB | Derived |。因此,指針指向BaseA的開始,所以將Derived引用到BaseB將讓您閱讀BaseA的成員。 – Chazz 2010-08-06 03:05:57