指向虚拟基类的指针上的C++Static_cast

C++ Static_cast over a pointer to virtual base class

本文关键字:C++Static cast 指针 虚拟 基类      更新时间:2023-10-16

经过大约6到7年几乎完全用C++编程后,我发现:

struct A
{
   virtual ~A() = 0; // Abstract class
};
A::~A() {}
struct B : virtual A
{};
int main()
{
    A* a = new B;
    (void)static_cast<B*>(a);
    return 0;
}

抛出编译器错误,因为标准不允许从指向虚拟基类的指针进行静态强制转换。我认为这与虚拟基类的内存布局有关,但我想知道细节。

原因是virtual AB中的内存映像与A的内存映像可能不同。如果不允许它有所不同,众所周知的"大胆的钻石"就无法解决(好吧,至少不容易,因为我们不能要求A意识到这一点,并建立一个对我们更有利的ABI(。将virtual A想象为每个函数都有一个虚拟函数,并且B中的A具有成员访问权限。它不一定是这样实现的,但你可以这样建模。