C ++双指针强制转换

时间:2014-02-14 10:56:19

标签: c++

此代码无效且无法编译:

struct A { int x; };

struct B : public A {};

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

虽然看起来很无辜,但似乎与reinterpret_cast一起使用。我知道有些情况下这不会那么简单,例如:当涉及多重继承时,但在这种特殊情况下,应该没有任何问题,编译器应该能够解决这个问题。那么为什么在C ++中不允许这样做呢?并且考虑到上面给出的类型,reinterpret_cast是解决此限制的好方法吗?

2 个答案:

答案 0 :(得分:5)

允许会发生什么:

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!

答案 1 :(得分:4)

即使在这种简单的情况下也存在问题,因为如果允许此转换,您可以将指向B的指针更改为指向A的实例:

A aObj;
B *bPtr;

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

最后一行将bPtr设置为指向aObj。所以现在指向B的指针实际指向A的实例。