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

virtual function with user-defined-type vector

本文关键字:函数 向量 类型 用户 定义      更新时间:2023-10-16

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

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()’

我是做错了什么事,还是我想做一些被语言禁止的事情?

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

您不必在TestSon中重新定义结构,并且您也不能这样做。fatherptr->get_myStructVect的调用者静态地返回vector<TestFather::myStruct>,因此编译器禁止您像这样重写基类函数,因为动态返回的对象可能与vector<TestFather::myStruct>不兼容(谁知道您在TestSon::myStruct中放入了什么,以及vector在行为上与基类向量有何不同?)。

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

禁止。因为你已经在派生类中重新定义了myStruct, vector派生类中的类型与基类中的类型不同。它们是两个不同的mystruct。

只能将虚函数的返回类型更改为继承自基类中声明的返回类型。但vectorTestFather::myStruct>

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

请注意,您可能不应该在这里按值返回类属性向量。

我不知道你真正想要做什么,但是如果嵌套结构是两个不同的东西,那么它们就不应该有相同的名称(如果它们是相同的,就不要重新定义它)。我的第一反应是,也许亲子关系不适合在这里。你考虑过其他选择吗?如果你真的需要在子类中返回一个不同的类型,而父类不知道,那么你就不能使用虚拟接口来做这件事。你应该给函数起不同的名字,这样你就知道返回类型应该是什么了。

如果你的目标更详细,你的回答会更好。

复制的私有结构在您的示例中有点奇怪。下面的代码编译得很好,例如:

类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存储。