c++ - C++ 中的多重多态

标签 c++ polymorphism multiple-inheritance

测试中存在编译错误“‘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/

相关文章:

c++ - 如何使用getaddrinfo()?

c++ - CPP 中没有构造函数错误的实例

c++ - 如何在 C++ 中创建一个允许多态返回不同类型的工厂方法?

c++ - 使用指向基类的指针作为数组参数

c++ 在运行时检查对象是否实现了接口(interface)

php - 奇怪的多重继承的优雅替代品

c++ - 在单独的文件夹中编译对象,隐式规则不匹配

c++ - 在没有 #define 的情况下捕获 __LINE__ 和 __FILE__

go - 如何在golang中编写一个函数来处理两种类型的输入数据

c++ - 为什么虚基多重继承只调用基类默认构造函数?