gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:27 25 4
gpt4 key购买 nike

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

现在在另一个测试中存在编译错误“'virtual void A::f()' in 'C' 没有唯一的最终覆盖程序”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 向上转型为父类(super class)型 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com