经过大约6 o 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;
}
抛出编译器错误,因为标准不允许从指向虚拟基类的指针进行静态强制转换。我假设这与与虚拟基类关联的内存布局有关,但我想知道详细信息。
答案 0 :(得分:0)
原因是,virtual A
内的B
和A
内存图像可能不同。不要让它与众不同,众所周知的钻石&#39;无法解决(好吧,至少不容易,因为我们不能要求A
意识到这一点,并建立一个比我们更优秀的ABI)。将virtual A
视为A
中B
的每个函数和成员访问权限的虚函数。它不一定像那样实现,但你可以这样建模。