假设我有一个基本抽象类:
class Foo {
public:
struct FooStruct;
virtual FooStruct *DoFoo() = 0;
};
现在我想在DoFoo
中实施Bar
并在其中定义FooStruct
:
class Bar: public Foo {
public:
struct FooStruct {
int data;
};
FooStruct *DoFoo() {
FooStruct *fs = new FooStruct;
fs->data = 42;
return fs;
}
};
但是,g++
(在我的情况下)将Foo::FooStruct
和Bar::FooStruct
视为两种不同的结构,并会抱怨invalid covariant type ...
因为我重新定义了方法的返回类型。< / p>
我该如何解决这个问题?
答案 0 :(得分:1)
我想你的目的是做一些事情:
Foo * my_foo = new Bar();
FooStruct * my_result = my_foo->DoFoo();
问题是,现在要使用my_result
,您必须知道struct
创建的Bar
是隐含的。{1}}。因此,您应该将返回的struct
外部定义为Foo
答案 1 :(得分:0)
你不能做你正在做的事情。虚函数在层次结构中应该具有相同的静态返回类型,而Foo :: FooStruct与Bar :: FooStruct无关。你似乎渴望的是如下:
// In Foo.h
struct FooStruct { virtual ~FooStruct() = default; }
class Foo {
public:
virtual FooStruct* DoFoo() = 0;
virtual ~Foo() = default;
};
// In Bar.h
struct DerivedFooStruct : FooStruct { };
struct Bar : public Foo {
FooStruct* DoFoo() { return new DerivedFooStruct(); } // Never mind memory mgmt
};
答案 2 :(得分:0)
您正在尝试创建一个不适合C ++类型系统的怪物。
想象一下有人试图多态地使用Foo
指针:
Foo* ptr = .... ; //getting the value from somewhere, e.g. an API call
??? result = ptr->DoFoo();
返回值的类型是什么?编译器不知道它。
为要返回的结构使用公共基类。前瞻性声明不会削减它。