2014-02-14 127 views
1

此代碼是無效的,並不會編譯:C++雙指針投

struct A { int x; }; 

struct B : public A {}; 

void f(B** p){ 
    A** pa = p; // type mismatch 
} 

它看起來無辜,雖然,它似乎與reinterpret_cast工作。據我所知,有些情況並不是那麼簡單,例如當涉及多重繼承時,但在這種特殊情況下,應該沒有任何問題,編譯器應該能夠弄清楚這一點。那麼爲什麼在C++中不允許這樣做呢?考慮到上面給出的類型,reinterpret_cast是一個很好的解決這個限制的方法嗎?

回答

4

即使在這個簡單的例子有一個問題,因爲你可以一個指針變爲B指向的A一個實例,如果這種轉換被允許:

A aObj; 
B *bPtr; 

A **aPtrPtr = &bPtr; 
*aPtrPtr = &aObj; 

最後一行設置bPtr點到aObj。所以現在指向B的指針實際上指向了A的一個實例。

4

可能是發生什麼,它允許:

struct A { int x; }; 

struct B : public A { int y; }; 

//... 

B b; 
B* pb = &b; 
A** ppa = &pb; 
A a; 
*ppa = &a; // ppa points to pb, thus henceforth, pb == &a 
pb->y = 100; // oops!