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

标签 c++ casting downcast virtual-inheritance static-cast

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

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;
}

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

最佳答案

原因是,BA 中的virtual A 的内存镜像可能不同。在不允许差异的情况下,无法解决著名的“大胆钻石”(好吧,至少不容易,因为我们不能请求 A 意识到这一点并设置更可取的 ABI给我们)。将 virtual A 视为对 BA 的每个函数和成员访问都有一个虚函数。它不一定像那样实现,但您可以那样建模。

关于C++ Static_cast 指向虚拟基类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38014745/

相关文章:

c++ - 为什么仅当 vector 中已有元素时才调用移动构造函数?

Java 泛型 - 从 "capture#1 of ?"到 "A"的未经检查的强制转换

Java 向下转型与反射

c++ - strncpy() 是 memcpy() 的特例吗?

c++ - 云的PCL注册

c++ - 如何使用 type_info 进行类型转换?

Java:转换 ParentClass 和 ChildClass(向下转型运行时错误)

arrays - 协议(protocol)类型数组不能向下转换为具体类型数组

c++ - 在 Visual Studio 中调试 - 我可以看到英特尔编译器库代码吗?

sql - PostgreSQL 中的 CAST