Почему 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
? но почему. Что такое рациональное?
- изменить -
Очень хорошие ответы ниже. В ответах подробно не указано, каким образом субобъекты и vtables могут быть заказаны. Следующая статья дает хорошие примеры для gcc:
http://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting