У меня довольно сложная иерархия классов, в которой классы являются кросс-подобными в зависимости друг от друга: Есть два абстрактных класса A и C, содержащие метод, который возвращает экземпляр C и A соответственно. В их унаследованных классах я хочу использовать тип совместного варианта, который в этом случае является проблемой, так как я не знаю способ переслать-объявить отношение отношения наследования.C++: Как я могу избежать «недопустимого ковариантного типа возврата» в унаследованных классах без кастинга?
Я получаю «test.cpp: 22: ошибка: недопустимый тип возвращаемого значения для« виртуальной 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 * в качестве типов возврата в унаследованных классах (было бы интуитивно для меня, что есть способ)?
Вам действительно нужен этот тип перепутывания? (назовем его связью может быть немного коротким) –
Иногда это не проблема языка, это проблема с тем, как мы пытаемся его использовать. Если ваши две иерархии настолько тесно связаны, я думаю, что вам будет лучше с одной иерархией (слияние 'A' с' C' и 'B' с' D'), так как очень похоже, что они не могут работать без друг друга в любом случае , –
Ну, у меня есть два типа классов: спецификация задачи и исполнитель, который фактически выполняет задачу (запускает несколько потоков). Сама спецификация должна быть фабрикой для задачи, и каждый исполнитель должен получить доступ к ее спецификации. И есть различные спецификации с их задачами. Таким образом, исполнитель обертывает спецификацию, поэтому соединение только сильное в одном направлении, в другом направлении это только заводской метод. – Searles