Si usted tiene un void * puntero a la clase derivada que se hereda de ambos BaseA
y BaseB
, ¿cómo el compilador del puntero de void*
a BaseA*
(o BaseB*
) sin saber que el puntero void*
es de tipo Derived
?casting con la herencia múltiple
Respuesta
No es así. La única garantía cuando se lanza hacia y desde un void*
usando un static_cast
es:
Un valor de tipo puntero a objeto convertido a "puntero a
cv void
" y de nuevo al tipo de puntero original, tendrá su valor original (C + +03 §5.2.9/10).
Por ejemplo, el siguiente código es incorrecto porque el void*
es echado a un tipo distinto del tipo de puntero original (la secuencia de reparto es B1*
->void*
->B2*
):
struct B1 { int i; };
struct B2 { int j; };
struct D : B1, B2 { };
D x;
B1* b1ptr = &x;
void* voidptr = b1ptr;
B2* b2ptr = static_cast<B2*>(voidptr);
Intentando usar b2ptr
aquí daría como resultado un comportamiento indefinido. El único tipo al que puede emitir voidptr
de forma segura es B1*
, ya que ese es el tipo del que se obtuvo el void*
(bueno, o en un char*
, ya que se puede acceder a cualquier cosa mediante un char*
).
El compilador no arroja el puntero void*
a nada, usted, el programador, do.
Con el fin de hacer algo útil con un puntero void*
, es necesario explícitamente echarlo a un puntero no void*
, y si se equivoca en lo que escriba el puntero señala realmente a, introduce Indefinido Comportamiento City .
- 1. Python La herencia múltiple
- 2. La herencia múltiple: 2Classes1Method
- 3. C++: La herencia múltiple con polimorfismo
- 4. C++ ¿Herencia múltiple con interfaces?
- 5. Esquemas XML con herencia múltiple
- 6. Casting de herencia privada/protegida
- 7. Casting y herencia de interfaz
- 8. ¿Es la herencia múltiple mal?
- 9. Herencia múltiple sin herencia múltiple y sin duplicación de código
- 10. Herencia múltiple en java
- 11. Herencia múltiple en C#
- 12. herencia múltiple Extjs?
- 13. Herencia múltiple en PHP
- 14. Herencia de Interfaz Múltiple
- 15. Codeigniter y Herencia Múltiple?
- 16. ¿Las interfaces son redundantes con herencia múltiple?
- 17. herencia múltiple lío
- 18. Herencia virtual pura, herencia múltiple, y C4505
- 19. C++ herencia múltiple fundición
- 20. C# herencia múltiple
- 21. MetaClass herencia múltiple inconsistencia
- 22. C++ herencia múltiple Pregunta
- 23. estilos herencia múltiple
- 24. Herencia y casting: ¿esto es bueno java?
- 25. No se puede lanzar una clase con herencia múltiple
- 26. vb.net: la herencia múltiple en una interfaz
- 27. Herencia múltiple de Objective-C
- 28. Documentar la herencia múltiple de PHP con PhpDoc
- 29. ambigua definición del operador() con la herencia múltiple
- 30. SQLAlchemy: La herencia múltiple con 'association_proxy' dinámico función de creador
Tu respuesta es correcta. De mi investigación si Derived amplía BaseA y BaseB, el objeto se presenta en la memoria como | BaseA | BaseB | Derived |. Por lo tanto, el puntero apunta al inicio de BaseA, por lo que la conversión derivada a BaseB hará que usted lea los miembros de BaseA. – Chazz