У меня довольно сложная иерархия классов, в которой классы являются перекрестными в зависимости друг от друга: есть два абстрактных класса A и C, содержащих метод, который возвращает экземпляр C и A соответственно.В их унаследованных классах я хочу использовать ко-вариантный тип, что в данном случае является проблемой, так как я не знаю способа прямого объявления объявления отношений наследования.
Я получаю "test.cpp: 22: error: неверный ковариантный тип возврата для 'virtual D * B :: outC ()'" - ошибка, поскольку компилятор не знает, что D является подклассом 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();
}
Если я изменяю тип возврата B :: outC () на C *, пример компилируется.Есть ли способ сохранить B * и D * в качестве возвращаемых типов в унаследованных классах (для меня было бы интуитивно понятно, что есть способ)?