创建从不同对象提供的类型继承的类对象

时间:2011-12-16 15:49:04

标签: c++ templates runtime instance

我有以下课程

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?

2 个答案:

答案 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 *,这样您就不必担心最后一行中的类型依赖性。