从类模板实现纯虚函数 - 参数类型

时间:2017-02-12 12:35:58

标签: c++ templates types covariance virtual-functions

我想创建一个抽象类模板,强制所有实例使用纯虚函数实现doStuff函数。

我有以下模板:

template<class T>
class X
{
    public:
        X() {};
        virtual ~X() {};
        virtual X<T>& doStuff(X<T>& x) = 0;
};

T = int的实例:

class Y : public X<int>
{
    public:
        Y();
        virtual ~Y();
        Y& doStuff(Y& x) {
            Y res;
            Y& res2 = res;
            return res2;
        }
};

我收到错误消息:

  

在会员功能'Y&amp; Ÿ:: doStuff(Y&安培;)”:    不能将变量'res'声明为抽象类型'Y'    因为以下虚函数在'Y'内是纯粹的:   X&安培; X :: doStuff(X&amp;)[with T = int]

如果我在Y中将参数的类型更改为doStuff,一切都很好:

class Y : public X<int>
 {
    public:
        Y();
        virtual ~Y();
        Y& doStuff(X<int>& x) {
            Y res;
            Y& res2 = res;
            return res2;
        }
};

当Y实现X?

时,为什么参数不能作为Y对象的引用?

Y&amp;的回报值不会创建类似的错误消息。

也许我使用错误的方法来实现我想要的东西 - 随时让我知道。

2 个答案:

答案 0 :(得分:3)

通过将Y&设置为参数,您可以更改doStuff的签名,因此res是抽象的。

即使X<int>&继承Y&

Y也不是X

答案 1 :(得分:2)

  

当Y实现X?

时,为什么参数不能作为Y对象的引用?

因为你必须提供在基础的纯虚函数中声明的确切签名。

那是

的原因
class Y : public X<int> {
    // ...
    X<int>& doStuff(X<int>& x) override;
};

作品。

查看工作Live Demo

更不用说返回对局部变量的引用是未定义的行为。