转发声明基类中的嵌套结构

时间:2015-10-01 17:05:49

标签: c++ oop

假设我有一个基本抽象类:

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::FooStructBar::FooStruct视为两种不同的结构,并会抱怨invalid covariant type ...因为我重新定义了方法的返回类型。< / p>

我该如何解决这个问题?

3 个答案:

答案 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();

返回值的类型是什么?编译器不知道它。

为要返回的结构使用公共基类。前瞻性声明不会削减它。