2010-07-25 11 views
6

ile Döküm, derleyici void* işaretçi türü Derived ait olduğunu bilmeden BaseA* (veya BaseB*) için void* işaretçisi döküm edebilir?birden miras

cevap

5

Yapmıyor. Bir static_cast kullanılarak bir void* gelen döküm tek garanti:

tipi işaretçi değeri orijinal değere sahip olacaktır için "işaretçi cv void için" ve orijinal işaretçi türüne dönüştürülür nesne (C + +03 §5.2.9/10).

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); 

girişiminde: void* orijinal işaretçi tür dışında bir tür atama çünkü Örneğin

, şu kod yanlış (>B2* - ->void* döküm sekansı B1* olduğu) b2ptr kullanmak burada tanımlanmamış davranışlarla sonuçlanır. voidptr güvenli bir şekilde yayınlayabileceğiniz tek tür, B1*'dir, çünkü bu, void* öğesinin alındığı türden bir şeydir (iyi ya da char* aracılığıyla, bir şey char* aracılığıyla erişilebilir).

3

Derleyici, void* işaretçisini hiçbir şeye göstermez - siz, programcı, yapın. Bir void* pointer ile yararlı bir şey yapmak için

, bir sivil void* işaretçi açıkça döküm onu ​​gerekiyor ve aslında gösteren işaretçi tipi konusunda yanılıyorsun, sen Tanımsız Davranış Şehir girmek .

+0

Cevabınız doğru. Araştırmamdan, Türetilmiş, BaseA ve BaseB'yi genişletiyorsa, nesne bellekte | BaseA | BaseB | Derived |. Böylece, işaretçi BaseA'nın başlangıcına işaret ediyor, bu yüzden BaseB'den türetilmiş bir döküm, BaseA'nın üyelerini okuyacaktır. – Chazz