我从未使用过多重继承,但最近阅读相关资料时开始思考如何在我的代码中实际应用它。通常情况下,当我使用多态性时,我通常会创建新的派生实例,并声明为基类指针,例如:
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();
但是,如果我将其声明为
A*
,那么我将失去类C和D继承层次结构的多态性。同样地,如果我将其声明为 C*
,那么我就会失去类A和B的多态性。如果我将其声明为 E*
,那么我通常无法通过基类指针访问对象,因此无法获得多态行为。
那么我的问题是,有什么解决方法吗?C++是否提供了一种可以解决这些问题的机制,还是必须在基类之间反复转换指针类型?显然,这非常麻烦,因为我不能直接执行以下操作:
A* myA = new E();
C* myC = dynamic_cast<C*>(myA);
由于该强制转换将返回一个NULL指针,因此需要注意。
C* myC = dynamic_cast<C*>(myA);
这样做吗? - Mr.Anubis