测试中存在编译错误“‘A’是‘C’的不明确基数”diamond multiple inheritance
下面,
struct A { void f();};
struct B1: A {};
struct B2: A {};
struct C: B1, B2 {};
void g() {A *o = new C;}
已解决virtual inheritance
下面,
struct B1: virtual A {};
struct B2: virtual A {};
现在另一个测试中存在编译错误“‘C’中的‘virtual void A::f()’没有唯一的最终重写器”diamond multiple polymorphism
下面,
struct A {virtual void f();};
struct B1: virtual A {void f();};
struct B2: virtual A {void f();};
struct C: B1, B2 {};
void g() {
A *o = new C;
o->f();
}
而且用dynamic_cast
也解决不了下面,
dynamic_cast<B1 *>(o)->f();
@注意
dynamic_cast<T *>(obj_ptr)
实际上是用来执行typesafe downcast
,即当obj_ptr指向的对象的运行时类型Tobj是T的子类型时,返回obj_ptr本身;否则为 NULL 指针。认为将子类型Tobj向上转换为父类型T是错误的,否则在运行时进行向上转换直接违背了多态性原理。
恕我直言,virtual inheritance
足够简洁,可以在编译时解决前半部分的问题。相比之下,您能提供一些解决运行时后半部分问题的方法吗?
@编辑
感谢您的指出dynamic_cast
不做这项工作。已更正。
为了解决第二半问题,似乎别无选择,只能在下面的菱形层次结构的最终子类上实现重写器,
struct C: B1, B2 {
void f() {B1::f();} //Hardcode to your choice of overrider
};
最佳答案
好吧,您仍然没有对 f()
进行唯一的重写:这需要在 C
中使用以下方式定义:
struct C: B1, B2 { void f() { this->B1::f(); } };
您可以显式限定函数以强制使用该函数,而无需动态分派(dispatch)(这是在对象完成构造且尚未销毁时调用抽象函数的唯一方法)。
关于c++ - C++ 中的多重多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9087364/