Wha*_*hee 8 c++ templates visual-studio-2010 crtp f-bounded-polymorphism
假设我有一个克隆派生类的基类:
class Base
{
public:
virtual Base * clone()
{
return new Base();
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
我有一组派生类,使用奇怪的重复模板模式实现:
template <class T>
class CRTP : public Base
{
public:
virtual T * clone()
{
return new T();
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
我试图从这个进一步得出这样的:
class Derived : public CRTP<Derived>
{
public:
// ...
};
Run Code Online (Sandbox Code Playgroud)
我得到编译错误的效果:
error C2555: 'CRTP<T>::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是编译器在实例化CRTP时不完全知道Derived的继承树的结果.此外,用(Base*)替换返回类型(T*)也会编译.但是,我想知道是否存在保留上述语义的工作.
一个不太漂亮的解决方法。
class Base
{
protected:
virtual Base * clone_p()
{
return new Base();
}
};
template <class T>
class CRTP : public Base
{
protected:
virtual CRTP* clone_p()
{
return new T;
}
public:
T* clone()
{
CRTP* res = clone_p();
return static_cast<T*>(res);
}
};
class Derived : public CRTP<Derived>
{
public:
};
Run Code Online (Sandbox Code Playgroud)
如果您觉得更安全,请使用dynamic_cast<>代替。static