具有用户定义类型向量的虚函数

时间:2011-04-12 16:41:30

标签: c++ templates implementation virtual-functions

我想定义一个带有struct变量向量的抽象基类,以及一个由派生类实现的虚函数:

class TestFather {

private:
    struct myStruct
    {
        // struct definition
    };
    vector<myStruct> myStructVect;

public:
    virtual vector<myStruct> get_myStructVect() = 0;
};

但是当我编写派生类时:

#include "TestFather.h"

class TestSon : public TestFather{

private:
    struct myStruct
    {
        // struct definition
    };
    vector<myStruct> myStructVect;

public:
    vector<myStruct> get_myStructVect();
};

我收到此错误:

invalid covariant return type for ‘virtual std::vector<ProvaSon::myStruct, std::allocator<ProvaSon::myStruct> > ProvaSon::get_myStructVect()’

我做错了什么或者我正在尝试做一些被语言禁止的事情?

5 个答案:

答案 0 :(得分:4)

两种myStruct类型完全不相关。这意味着您正在尝试覆盖TestFather::get_myStructVect()并让它返回完全不同的类型。这是不允许的。

答案 1 :(得分:3)

您无需在TestSon中重新定义结构,也无法执行此操作。 fatherptr->get_myStructVect的调用者静态返回vector<TestFather::myStruct>,因此编译器禁止覆盖基类函数,因为动态返回的对象可能与vector<TestFather::myStruct>不兼容(谁知道)你放入TestSon::myStruct的内容以及vector行为与基类向量的不同之处?)。

至于允许的差异,C ++只允许派生类返回类型是基类返回类型的派生类,并且只有当返回类型是指针或引用时才是。

答案 2 :(得分:2)

这是被禁止的。因为您已在派生类中重新定义了myStruct,所以vector&lt; myStruct&gt;派生类中的类型与基类中的类型不同。它们是两个不同的myStructs。

您只能将该虚函数的返回类型更改为从基类中声明的返回类型继承的内容。但是矢量&lt; TestSon :: myStruct&gt;不会从vector&lt; TestFather :: myStruct&gt;

继承

答案 3 :(得分:2)

vector<myStruct>但是由于您在子类中更改了myStruct,它实际上是两种不同的类型,因此两个函数中的每一个都认为它返回不同的类型。这仅适用于协变类型,其中类型与包含函数的类的实际类型相关。

请注意,无论如何,您可能不应该按值返回类属性向量。

我无法分辨你真正打算做什么,但如果它们是两个不同的东西(如果它们是相同的,不要重新定义它们),嵌套结构真的不应该有相同的名称。 。我的第一个直觉反应是,这里的亲子关系可能不合适。你考虑过其他选择吗?如果您确实需要在子级中返回其他类型而父级不知道该类型,则您无法使用虚拟接口执行此操作。您应该只为函数指定不同的名称,以便知道返回类型应该是什么。

有关您的目标的更多详细信息,可以提供更好的答案。

答案 4 :(得分:1)

在您的示例中,重复的私有结构有点奇怪。以下编译很好,例如:

class TestFather {

protected:
    struct myStruct
    {
        // struct definition
    };
    vector<myStruct> myStructVect;

public:
    virtual vector<myStruct> get_myStructVect() = 0;
};

class TestSon : public TestFather{



public:
    vector<myStruct> get_myStructVect();
};

int main(int argc, char**argv)
{
   TestSon testSon;
}

注意用protected替换private,允许派生类访问父结构定义和myStructVect存储。