c – 衍生出奇怪的重复模板和协方差

假设我有一个克隆派生类的基类:
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<>如果你觉得它更安全,而不是静态.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...