【发布时间】:2010-03-09 16:16:50
【问题描述】:
我有一个非常复杂的类层次结构,其中的类是相互依赖的交叉类:有两个抽象类 A 和 C,其中包含一个分别返回 C 和 A 实例的方法。在他们继承的类中,我想使用协变类型,在这种情况下这是一个问题,因为我不知道一种方法来前向声明继承关系。
我得到一个“test.cpp:22: error: invalid covariant return type for '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* 作为返回类型(对我来说有办法很直观)?
【问题讨论】:
-
你真的需要那种类型的纠缠吗? (称它为耦合可能有点短)
-
有时不是语言的问题,而是我们尝试使用它的方式的问题。如果您的两个层次结构如此紧密地耦合,我认为您最好使用一个层次结构(将
A与C和B与D融合在一起),因为看起来他们无论如何都无法单独工作. -
好吧,我有两种类型的类:任务规范和实际执行任务(启动多个线程)的执行程序。规范本身应该是任务的工厂,每个执行者都需要访问它的规范。他们的任务有各种规格。所以执行器包装了一个规范,所以耦合只在一个方向上是强的,在另一个方向上它只是工厂方法。
标签: c++ inheritance covariance