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
です?しかし、なぜ。合理的なものは何ですか?
-編集-
以下の非常に良い答え。ただし、サブオブジェクトとvtableがどのように順序付けられるかを正確に説明する回答はありません。次の記事は、gccのいくつかの良い例を示しています:
http ://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting