2017-09-13 82 views
2

以下C++代碼是否正確?在C++中訪問具有不正確downcast的基類成員

struct Base { int x; }; 
struct Derived : Base { int y; } 
Base * b = new Base; 
Derived * d = static_cast<Derived *>(b); 
//below we access only d->x, but not d->y 
std::cout << d->x; 

如果不是,究竟是什麼錯誤? C++標準對此有何評論?至少我沒有見過它墜毀。

+0

'x'和'y'在這裏是私人的。 –

+2

'Base b = new Base;'給你一個'Base'。你不能神奇地從中得到一個「派生」。 – NathanOliver

+0

僅僅因爲這個簡單的例子的作品並不意味着你可以依靠它爲其他案件工作。 –

回答

11

這是[expr.static.cast]/11(重點煤礦)相當簡單:

類型的prvalue「指針CV1 B」,其中B是一個類型,可以轉化成類型的prvalue「指針到cv2 D「,其中D是從B派生的類,如果cv2與cv1具有相同的cv限定或者更高的cv限定。如果B是D的虛擬基類或D的虛擬基類的基類,或者如果不存在從「指向D的指針」到「指向B的指針」的有效標準轉換([conv.ptr]),則程序是不合格的。空指針值被轉換爲目標類型的空指針值。 如果「指向cv1 B的指針」類型的指針指向實際上是D類型對象的子對象的B,則生成的指針指向D類型的封閉對象。否則,行爲是未定義的。

您沒有Derived的子對象,所以它是未定義的行爲。


注有用於左值或x值沒有指針特殊情況下,和/ 8提到,操作數經歷左值到右值轉換。