ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-28 17:08:48  阅读:288  来源: 互联网

标签: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;
        }
};

我收到错误消息:

In member function ‘Y& Y::doStuff(Y&)’:
cannot declare variable ‘res’ to be of abstract type ‘Y’
because the following virtual functions are pure within ‘Y’:
X& X::doStuff(X&) [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&的回报值不会创建类似的错误消息.

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

解决方法:

Why can the parameter not be a reference to a Y object when Y implements X?

因为您必须提供在基本的纯虚函数中声明的确切签名.

这就是为什么

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

作品.

见工作Live Demo.

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

标签:c,templates,types,covariance,virtual-functions
来源: https://codeday.me/bug/20190828/1753752.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有