簡體   English   中英

通過錯誤的指針調用base function

[英]Calling base function through wrong pointer

拋開所有反對編寫如下代碼的良好做法,僅從語言律師的角度來看,以下代碼段是否合法?

struct Base {
  int f() { return 42; }
};
struct D1 : Base {};
struct D2 : Base {};

int main() {
  D2 d2;
  D1* ouch = reinterpret_cast<D1*>(&D2);
  return ouch->f();
}

在我看來, [class.mfct.non.static]是最相關的子句,它表明它是可以的,因為我們為派生的 ZA2F2ED4F8EBC2CBB4ZC21A29 的 object

如果非虛擬案例確實是合法的,如果f或 inheritance 是虛擬的,會有什么變化嗎?

CWG 2535強調,與聯合不同(可以重用標准布局類型的常見初始序列),通過不同的 class 類型的指針訪問 class 成員是未定義的。

對於一個實際相關的實例:如果您使用 created 指針來修改d2的成員,則由於別名分析,可能會在優化期間重新安排對該成員的其他訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM