2011-12-16 50 views
0

创建从提供的类型继承的类的对象我有以下类由不同的对象

class CommonStyle 
{}; 

class Style1 : public CommonStyle 
{}; 

class Style2 : public CommonStyle 
{}; 

class Style3 : public CommonStyle 
{}; 

template<typename T> class ZStyle : public T 
{ 
}; 

我有对象可以是STYLE1,蓝紫魅力,节日礼物的类型。 如何根据提供的对象创建从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

你不能写`ZStyle * zobj1`,你必须拼出来类型:`ZStyle * zobj1`。 – kennytm 2011-12-16 15:52:36

+1

这个架构的实际目标是什么是非常不清楚的。你能详细说明吗? – 2011-12-16 15:53:43

回答

0

我可能会回答一个不同的问题,但它可能是解决您的问题。

virtual constructor idiom可能会有所帮助。

您在基类中创建了一个名为clone()的虚拟方法,该方法在子类中被覆盖。然后,你写了 CommonStyle * zobj1 = obj1.clone(); CommonStyle * zobj2 = obj2.clone(); CommonStyle * zobj3 = obj3.clone();

这导致静态类型CommonStyle三个对象,但动态类型取决于什么对象,他们的clone()“从天。

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 *,所以你不必担心关于最后一行中的类型依赖性。