此代码无效且无法编译:
struct A { int x; };
struct B : public A {};
void f( B** p ){
A** pa = p; // type mismatch
}
虽然看起来很无辜,但似乎与reinterpret_cast
一起使用。我知道有些情况下这不会那么简单,例如:当涉及多重继承时,但在这种特殊情况下,应该没有任何问题,编译器应该能够解决这个问题。那么为什么在C ++中不允许这样做呢?并且考虑到上面给出的类型,reinterpret_cast
是解决此限制的好方法吗?
答案 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
的实例。