繁体   English   中英

模板子类的协变量返回类型无效

[英]invalid covariant return type for templated child class

我有一个从父类继承的子类,但是该子类也使用了模板参数。 这两个类都有一个“克隆”函数,仅调用其复制构造函数。 我想将副本虚拟化,以便子类始终调用其自己的副本。

这是问题的简化版本:

#include <iostream>
using namespace std;

class Parent
{
public:
    virtual Parent foo() { cout << "Parent Foo\n"; return *this; }
};

template <class T>
class Child : public Parent
{
public:
    Child<T> foo() { cout << "Child Foo\n"; return *this; }
};

int main()
{
    Child<int> c;

    c.foo();

    return 0;
}

似乎Child类应该与Parent类协变。 我想念什么? 有没有办法保留虚拟功能和模板? 谢谢。

编辑

也许我以前的例子太简单了。 这是一个扩展的简单示例:

#include <iostream>
using namespace std;

class Parent
{
public:
    Parent(){}
    virtual Parent clone() const { return Parent(*this); }
private:
    Parent( Parent const& cpy ) { };
};

template <class T>
class Child : public Parent
{
public:
    Child(){}
    Child<T> clone() const { return Child<T>(*this); }
private:
    Child( Child<T> const& cpy ) {};
};

int main()
{
    Child<int> c;
    Parent* pc = &c;
    pc->clone();

    return 0;
}

我希望通过将副本虚拟化,该副本始终是该类的实际副本。 我想避免返回指针,但是看起来我将不得不返回指针以避免DieterLücking提到的切片问题。

父和子类型不是协变的,但父和子类型是。

#include <iostream>
using namespace std;

class Parent
{
public:
    virtual Parent& foo() = 0;
};

template <class T>
class Child : public Parent
{
public:
    Child& foo() { cout << "Child Foo\n"; return *this; }
};

int main()
{
    Child<int> c;
    Parent& parent = c.foo();
    return 0;
}

从10.3.7虚拟函数开始

覆盖函数的返回类型应与覆盖函数的返回类型相同或与函数的类协变。 如果函数D :: f覆盖函数B :: f,则函数的返回类型如果满足以下条件,则它们是协变的:

—都是类的指针,都是类的左值引用,或者都是类的右值引用112

— B :: f的返回类型的类与D :: f的返回类型的类相同,或者是D的返回类型的该类的明确且可访问的直接或间接基类: :F

—指针或引用都具有相同的cv限定,并且D :: f的返回类型中的类类型具有与b :: f的返回类型中的类类型相同或更少的cv限定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM