Я пытаюсь провести рефакторинг некоторого кода, оставляя существующую функциональность в такте. У меня возникли проблемы с приведением указателя на объект в базовый интерфейс и последующим выводом производного класса. Программа использует фабричный объект для создания экземпляров этих объектов в определенных случаях.
Вот несколько примеров классов, с которыми я работаю.
// 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
}
...
}
Этот вопрос содержит хорошую информацию о том, что делают разные типы кастинга, но это не помогает мне разобраться в этой ситуации. Использование static_cast и обычного приведения дает мне error C2594: 'static_cast': ambiguous conversions from 'MyObject *' to 'ISerializable *'
. Использование dynamic_cast приводит к тому, что createObject () возвращает NULL. Классы стилей NormalObject и старая версия MyObject работают с существующим static_cast на заводе.
Есть ли способ заставить этот актерский состав работать? Кажется, это должно быть возможно.