Estoy tratando de refactorizar algunos códigos mientras dejo la funcionalidad existente intacta. Tengo problemas para lanzar un puntero a un objeto en una interfaz base y luego obtener la clase derivada más tarde. El programa usa un objeto de fábrica para crear instancias de estos objetos en ciertos casos.No se puede lanzar una clase con herencia múltiple
Aquí hay algunos ejemplos de las clases con las que estoy trabajando.
// This is the one I'm working with now that is causing all the trouble.
// Some, but not all methods in NewAbstract and OldAbstract overlap, so I
// used virtual inheritance.
class MyObject : virtual public NewAbstract, virtual public OldAbstract { ... }
// This is what it looked like before
class MyObject : public OldAbstract { ... }
// This is an example of most other classes that use the base interface
class NormalObject : public ISerializable
// The two abstract classes. They inherit from the same object.
class NewAbstract : public ISerializable { ... }
class OldAbstract : public ISerializable { ... }
// A factory object used to create instances of ISerializable objects.
template<class T> class Factory
{
public:
...
virtual ISerializable* createObject() const
{
return static_cast<ISerializable*>(new T()); // current factory code
}
...
}
This question tiene buena información sobre lo que los diferentes tipos de fundición hacen, pero no ayuda a averiguar esta situación. Usando static_cast y casting regular me da error C2594: 'static_cast': ambiguous conversions from 'MyObject *' to 'ISerializable *'
. El uso de dynamic_cast hace que createObject() devuelva NULL. Las clases de estilo NormalObject y la versión anterior de MyObject funcionan con la static_cast existente en la fábrica.
¿Hay alguna manera de hacer que este elenco funcione? Parece que debería ser posible.
+1: Esto funcionó en gcc también. – Troubadour
Exactamente la solución recomendada por las preguntas frecuentes: http://www.parashift.com/c++faq-lite/multiple-inheritance.html#faq-25.8 –
Esto lo resolvió.No me di cuenta de que los resúmenes eran los que necesitaban heredar virtualmente. @Mark Ransom, gracias por el gran enlace. Toda esa página es muy útil. –