具有用户定义类型向量的虚函数
我想定义一个带有结构变量向量的抽象基类,以及一个由派生类实现的虚函数:
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()’
我做错了什么还是可能我正在尝试做一些语言禁止的事情?
I want to define an abstract base class with a vector of struct variables, and a virtual function to be implemented by derived classes:
class TestFather {
private:
struct myStruct
{
// struct definition
};
vector<myStruct> myStructVect;
public:
virtual vector<myStruct> get_myStructVect() = 0;
};
but when I write the derived class:
#include "TestFather.h"
class TestSon : public TestFather{
private:
struct myStruct
{
// struct definition
};
vector<myStruct> myStructVect;
public:
vector<myStruct> get_myStructVect();
};
I get this error:
invalid covariant return type for ‘virtual std::vector<ProvaSon::myStruct, std::allocator<ProvaSon::myStruct> > ProvaSon::get_myStructVect()’
Am I doing something wrong or maybe I'm trying to do something that is forbidden by the language?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这两个
myStruct
类型完全不相关。这意味着您正在尝试重写 TestFather::get_myStructVect() 并让它返回完全不同的类型。这是不允许的。The two
myStruct
types are totally unrelated. This means that you're trying to overrideTestFather::get_myStructVect()
and have it return a completely different type. This is not allowed.您不必在
TestSon
中重新定义结构体,而且您也不能这样做。fatherptr->get_myStructVect
的调用者静态获取vector
返回,因此编译器禁止您像这样重写基类函数,因为动态返回的对象可能与vector
不兼容(谁知道你在TestSon::myStruct
中放入了什么以及如何vector
行为与基类向量不同?)。至于允许的差异,C++只允许派生类返回类型是基类返回类型的派生类,并且仅当返回类型是指针或引用时才允许。
You don't have to redefine the struct in
TestSon
, and you also can't do this. The caller offatherptr->get_myStructVect
statically gets avector<TestFather::myStruct>
back, so the compiler forbids you to override the base class function like that, because the dynamically returned object would potentially be incompatible withvector<TestFather::myStruct>
(who knows what you put intoTestSon::myStruct
and howvector
differs in behavior from the base class vector?).As for the allowed difference, C++ only allows the derived class return type to be a derived class of the base class return type, and only when the return types are pointers or references.
这是禁止的。因为您在派生类中重新定义了 myStruct,所以 vector派生类中的类型与基类中的类型不同。它们是两个不同的 myStructs。
您只能将该虚拟函数的返回类型更改为从基类中声明的返回类型继承的类型。但是向量不继承自 vector;
It's forbidden. Because you've redefined myStruct in your derived class, vector<myStruct> is a different type in the derived class than it is in the base class. They are two different myStructs.
You can only change the return type of that virtual function to something inherited from the return type declared in the base class. But vector<TestSon::myStruct> does not inherit from vector<TestFather::myStruct>
它说
vector
但由于您在子类中更改了myStruct
,它实际上是两种不同的类型,因此两个函数中的每一个都认为其返回不同的类型。这仅适用于协变类型,其中类型与包含该函数的类的实际类型相关。请注意,无论如何,您可能不应该在此处按值返回类属性向量。
我不知道你真正打算做什么,但是如果嵌套结构是两个不同的东西,那么它们确实不应该具有相同的名称(如果它们相同,则不要重新定义它)。我的第一直觉反应是,也许亲子关系在这里不合适。您考虑过其他选择吗?如果您确实需要在子级中返回不同的类型并且父级不知道这一点,那么您不能使用虚拟接口来执行此操作。您应该给函数指定不同的名称,这样您就知道返回类型应该是什么。
通过有关您目标的更多详细信息,可以提供更好的答案。
It says
vector<myStruct>
but since you changedmyStruct
in the child class it's actually two distinct types so each of the two functions thinks its returning a different type. This is only allowed for covariant types where the type is related to the actual type of the class containing the function.Note that you probably shouldn't be returning a class attribute vector by value here anyway.
I can't tell what you really are intending to do, but the nested structures really shouldn't have the same name if they're two different things (and if they're the same, don't redefine it). My first gut reaction is that maybe the parent-child relationship isn't appropriate here. Have you considered other options? If you really need to return a different type in the child and the parent doesn't know about that, then you can't use a virtual interface to do this. You should just give the functions different names so you know what the return type should be.
With more details about your goals a better answer could be provided.
在您的示例中,重复的私有结构有点奇怪。例如,下面的代码可以正常编译:
class TestFather {
请注意将 private 替换为 protected,允许派生类访问父结构定义和 myStructVect 存储。
The duplicate private structure is a bit odd in your example. The below compiles fine, for instance:
class TestFather {
Note the replacement of private with protected, allowing derived classes access to the parent structure definition and myStructVect storage.