我有以下课程
class CommonStyle
{};
class Style1 : public CommonStyle
{};
class Style2 : public CommonStyle
{};
class Style3 : public CommonStyle
{};
template<typename T> class ZStyle : public T
{
};
我有一个对象,可以是Style1,Style2,Style3的类型。 如何根据提供的对象创建继承自Style1或Style2或Style3的ZStyle对象?
//pseudo-code
int _tmain(int argc, _TCHAR* argv[])
{
CommonStyle* obj1 = new Style1();
CommonStyle* obj2 = new Style2();
CommonStyle* obj3 = new Style3();
ZStyle* zobj1 = create_object_inherited_from_style1(obj1);
ZStyle* zobj2 = create_object_inherited_from_style2(obj2);
ZStyle* zobj3 = create_object_inherited_from_style3(obj3);
}
是否可以避免使用dynamic_cast?
答案 0 :(得分:0)
我可能会回答一个不同的问题,但这可能是解决问题的方法。
virtual constructor idiom可能会有所帮助。
您在基类中创建一个名为 clone()的虚拟方法,该方法在后代类中被重写。然后,你写 CommonStyle * zobj1 = obj1.clone(); CommonStyle * zobj2 = obj2.clone(); CommonStyle * zobj3 = obj3.clone();
这导致三个对象具有静态类型CommonStyle,但是动态类型取决于它们是clone()来自哪个对象。
答案 1 :(得分:0)
以下类似CRTP的修改如何:
template<typename T> class ZStyle : public T
{
ZStyle(T const &);
};
class CommonBase
{
/* original CommonStyle in here */
virtual CommonBase * z() const = 0;
}
template<typename T> class CommonStyle : public CommonBase
{
virtual ZStyle<T> * z() const
{
return new ZStyle<T>(static_cast<T const&>(*this));
}
};
class Style1 : public CommonStyle<Style1> { };
class Style2 : public CommonStyle<Style2> { };
class Style3 : public CommonStyle<Style3> { };
用法:
CommonStyle* obj1 = new Style1();
ZStyle<Style1> * p = obj1.z();
或者,您可以将z()
的返回类型设为CommonBase *
,这样您就不必担心最后一行中的类型依赖性。