C++双指针投射

C++ double pointer cast

本文关键字:指针 C++      更新时间:2023-10-16

此代码无效且无法编译:

struct A { int x; };
struct B : public A {};
void f( B** p ){
    A** pa = p; // type mismatch
}

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

如果允许,会发生什么:

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!

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

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

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