我从未使用过多重继承,但在最近阅读它时,我开始思考如何在我的代码中实际使用它。当我通常使用多态性时,我通常通过创建声明为基类指针的新派生实例来使用它,例如
BaseClass* pObject = new DerivedClass();
以便在派生类上调用虚函数时获得正确的多态行为。通过这种方式,我可以拥有不同多态类型的集合,这些多态类型通过它们的虚函数管理自己的行为。
在考虑使用多重继承时,我正在考虑相同的方法,但是如果我有以下层次结构,我将如何做到这一点
class A {
virtual void foo() = 0;
};
class B : public A {
virtual void foo() {
// implementation
}
};
class C {
virtual void foo2() = 0;
};
class D : public C {
virtual void foo2() {
// implementation
}
};
class E : public C, public B {
virtual void foo() {
// implementation
}
virtual void foo2() {
// implementation
}
};
有了这个层次结构,我可以创建一个 E 类的新实例
A* myObject = new E();
或者
C* myObject = new E();
或者
E* myObject = new E();
但是如果我将它声明为 aA*
那么我将失去类 C 和 D 继承层次结构的多态性。同样,如果我将其声明为,C*
那么我将失去 A 类和 B 类多态性。如果我声明它,E*
那么我无法以我通常的方式获得多态行为,因为对象不是通过基类指针访问的。
所以我的问题是解决这个问题的方法是什么?C++ 是否提供了一种可以解决这些问题的机制,还是必须在基类之间来回转换指针类型?当然这很麻烦,因为我无法直接执行以下操作
A* myA = new E();
C* myC = dynamic_cast<C*>(myA);
因为强制转换会返回一个 NULL 指针。