기존 기능을 그대로두고 일부 코드를 리팩토링하려고합니다. 개체에 대한 포인터를 기본 인터페이스로 캐스팅하고 나중에 파생 클래스를 가져 오는 데 문제가 있습니다. 프로그램은 경우에 따라 팩토리 객체를 사용하여 이러한 객체의 인스턴스를 만듭니다.다중 상속을 사용하여 클래스를 캐스팅 할 수 없습니다.
다음은 내가 작업중인 클래스의 몇 가지 예입니다.
// 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 주조의 종류가하는 일에 대한 좋은 정보를 가지고 있지만 나를이 상황을 파악 도움이 아니에요. static_cast와 일반 캐스팅을 사용하면 error C2594: 'static_cast': ambiguous conversions from 'MyObject *' to 'ISerializable *'
이됩니다. dynamic_cast를 사용하면 createObject()가 NULL을 반환합니다. NormalObject 스타일 클래스와 이전 버전의 MyObject는 공장에서 기존 static_cast와 함께 작동합니다.
이 캐스트 작업을 수행 할 수있는 방법이 있습니까? 그것은 가능한 것처럼 보입니다.
+1 : 이것은 gcc에도 적용됩니다. – Troubadour
FAQ에서 권장하는 솔루션과 정확히 일치 : http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8 –
해결되었습니다.나는 초록이 사실상 상속 할 필요가 있다는 것을 깨닫지 못했습니다. @ 마크 랜섬, 훌륭한 링크에 감사드립니다. 전체 페이지가 매우 도움이됩니다. –