2014-02-14 171 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!