为什么
解决方案是使用
--编辑--
下面有很好的答案。没有一个答案详细说明子对象和虚函数表如何被排序。以下文章为gcc提供了一些很好的例子:
http://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting
static_cast
不能从虚基类进行向下转换?struct A {};
struct B : public virtual A {};
struct C : public virtual A {};
struct D : public B, public C {};
int main()
{
D d;
A& a = d;
D* p = static_cast<D*>(&a); //error
}
g++ 4.5 说:
error: cannot convert from base ‘A’ to derived type ‘D’ via virtual base ‘A’
解决方案是使用
dynamic_cast
?但是为什么呢?有什么理性依据吗?--编辑--
下面有很好的答案。没有一个答案详细说明子对象和虚函数表如何被排序。以下文章为gcc提供了一些很好的例子:
http://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting
dynamic_cast
,您的示例也无法正常工作,除非类A
至少包含一个虚成员函数。 - Björn Pollexdynamic_cast
,但是类必须被声明为虚拟类。 - log0D *p = static_cast<D *>(static_cast<B *>(&a));
- Simon Richterstatic_cast
将无法工作。 - log0