2015-10-01 149 views
2

假设我有一个抽象基类:正向声明嵌套stucture在基类

class Foo { 
public: 
    struct FooStruct; 
    virtual FooStruct *DoFoo() = 0; 
}; 

现在我想实现在BarDoFoo,还可以定义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 ...,因为我重新定义返回类型的a 方法。

我该如何解决这个问题?

+0

您还需要定义'Foo :: FooStruct'。您定义'Bar :: FooStruct'的事实并不重要。 –

+1

您需要一个通用的基类来获取返回的值。 –

回答

1

我猜你的章节目标然后做一些如:

Foo * my_foo = new Bar(); 
FooStruct * my_result = my_foo->DoFoo(); 

的问题是,使用my_result现在,你必须知道它是隐含已由Bar创建一个struct。因此,您应该定义返回的structFoo

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 
}; 
0

您正试图创建一个不适合C++类型系统的怪物。

想象有人试图使用Foo指针多态:

Foo* ptr = .... ; //getting the value from somewhere, e.g. an API call 
??? result = ptr->DoFoo(); 

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

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