将指针转换为指向虚拟基址的指针

问题描述 投票:0回答:1

我需要将指向派生类型指针的指针转换为指向虚拟基类型指针的指针。为什么这不起作用以及如何创建指针?

struct A { virtual void f () { printf ("A::f"); }};
struct B : virtual A { void f () override { printf ("B::f"); }};

B b;
B* bp = &b;
B** bpp = &bp;
A* ap = reinterpret_cast<A*> (bp);
A** app = reinterpret_cast<A**> (bpp);

unsigned long long ai = (unsigned long long)*app;
unsigned long long bi = (unsigned long long)*bpp;

assert (ai == bi);                      // ok
(*reinterpret_cast<B**> (app))->f ();   // ok
ap->f ();                               // ok
(*app)->f ();                           // access violation
c++ pointers pointer-to-pointer
1个回答
0
投票

您提供的代码片段尝试使用reinterpret_cast将指向派生类型指针(

B**
)的指针转换为指向虚拟基类型指针(
A**
)的指针。但是,这是不可能的,因为这两种指针类型不兼容。 reinterpret_cast 只能用于在兼容的指针类型之间进行转换,并且
A**
B**
不兼容。

要解决此问题,您可以使用向下转型,这是一种类型转换,可将指针从基类类型显式转换为派生类类型。仅当指针指向派生类类型的对象时,向下转型才是安全的。

下面是如何将指针从

B**
向下转换为
A**
的示例: C++

struct A { virtual void f() { printf("A::f"); } };
struct B : virtual A { void f() override { printf("B::f"); } };

B b;
B* bp = &b;
B** bpp = &bp;

A** app = reinterpret_cast<A**> (bpp);

// Downcast the pointer to pointer
B* pb = *app;

// Use the downcast pointer
pb->f();

谨慎使用代码。了解更多

此代码首先将指针 (

app
) 向下转换为指向派生类型的指针 (
pb
)。然后,它使用向下转型指针 (
pb
) 来调用派生类成员函数 (
f
)。

通过向下转型,你可以安全地将指针从

B**
转换为
A**
,这样你就可以通过基类指针访问派生类成员函数。

© www.soinside.com 2019 - 2024. All rights reserved.