我有一个扩展 B 的 D 类,它扩展了 A。我现在想添加一个 C 类,它具有与 B 完全相同的接口,但提供不同的实现。所以我设计如下:
这并不是我想要的,因为我只需要一个 D 的实例来扩展 B 或 C 而不是同时扩展两者,但是,这仅在运行时确定。上面设计的问题当然是,如果我在 D 中调用一个在 B 和 C 中都实现的方法,它会模棱两可。
所以我想要的是在运行时创建 B 或 C 的实例,然后将其转换为 D。每次 D 的实例调用继承的方法时,它都应该使用其原始对象之一。
我需要在每个方法调用周围摆弄 typeid 和 if/else 还是有更优雅的方法来做到这一点?
class A{
virtual f1();
virtual f2();
}
class B : public virtual A{
f1();
f2();
f3();
}
class C : public virtual A{
f1();
f2();
f3();
}
class D : public B, public C{
f4(){f1(); f3)};
}
...
D* d = new D();
E* e = new E(d);
e->d->f1();
e->d->f4();
然后将 D 的实例传递给另一个与 D 一起工作的类 (E),因此,我无法修改 D 的接口。