假设我有一个克隆派生类的基类:
- class Base
- {
- public:
- virtual Base * clone()
- {
- return new Base();
- }
- // ...
- };
我有一组派生类,使用奇怪的重复模板模式实现:
- template <class T>
- class CRTP : public Base
- {
- public:
- virtual T * clone()
- {
- return new T();
- }
- // ...
- };
我试图从这个进一步得出这样的:
- class Derived : public CRTP<Derived>
- {
- public:
- // ...
- };
- error C2555: 'CRTP<T>::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
我意识到这可能是编译器在实例化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:
- };
使用dynamic_cast<>如果你觉得它更安全,而不是静态.