I have a quite complex class hierarchy in which the classes are cross-like depending on each other: There are two abstract classes A and C containing a method that returns an instance of C and A, respectively. In their inherited classes I want to use a co-variant type, which is in this case a problem since I don’t know a way to forward-declare the inheritance relation ship.
I obtain a “test.cpp:22: error: invalid covariant return type for ‘virtual D* B::outC()’”-error since the compiler does not know that D is a subclass of C.
class C;
class A {
public:
virtual C* outC() = 0;
};
class C {
public:
virtual A* outA() = 0;
};
class D;
class B : public A {
public:
D* outC();
};
class D : public C {
public:
B* outA();
};
D* B::outC() {
return new D();
}
B* D::outA() {
return new B();
}
If I change the return type of B::outC() to C* the example compiles. Is there any way to keep B* and D* as return types in the inherited classes (it would be intuitive to me that there is a way)?
I know of no way of having directly coupled covariant members in C++. You’ll have either to add a layer, or implement covariant return yourself.
For the first option
and for the second
Note that this second option is what is done implicitly by the compiler (with some static checks that the static_cast is valid).