在几乎完全使用 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;
}
抛出编译器错误,因为标准不允许从指向虚拟基类的指针进行静态转换。我认为这与虚拟基类关联的内存布局有关,但我想知道详细信息。
最佳答案
原因是,B
和A
中的virtual A
的内存镜像可能不同。在不允许差异的情况下,无法解决著名的“大胆钻石”(好吧,至少不容易,因为我们不能请求 A
意识到这一点并设置更可取的 ABI给我们)。将 virtual A
视为对 B
中 A
的每个函数和成员访问都有一个虚函数。它不一定像那样实现,但您可以那样建模。
关于C++ Static_cast 指向虚拟基类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38014745/