gpt4 book ai didi

c++ - 带指针的菱形继承(钻石问题)虚拟成员类型转换

转载 作者:行者123 更新时间:2023-11-28 04:33:23 25 4
gpt4 key购买 nike

THIS QUESTION 相似但不完全相同:

    A
/ \
B C
\ /
D

我想要的是:

struct A { virtual void func (void) = 0; };

struct B : virtual A { void func (void) {} };
struct C : virtual A { void func (void) {} };

struct D : B,C { void func (void) {} };

int main ()
{
A *p = new D();
((C*) p)->func(); // do C::func
((B*) p)->func(); // do B::func
}

根据 THIS QUESTION只要继承只是多重继承而不是菱形,这似乎不是问题。为什么这不适用于菱形?

显然它是模棱两可的,但我希望能够做的是转换指针并因此使用虚函数的不同父实现,即:

((C*) p)->func(); //does C::func

如果我运行上面的代码,我会遇到错误:

error: cannot convert from pointer to base class 'A' to pointer to derived class 'C' because the base is virtual
((C*)p)->func();

我试着用谷歌搜索但找不到任何地方

最佳答案

func在整个层次结构中是虚拟的,任何直接调用 func通过指向所涉及的任何类型的指针将调用 D::func .要在问题的代码中进行转换,请使用 dynamic_cast<C*>(p) .但这并没有消除 func 的虚拟性。 ,所以最终会调用 D::func , 正如 p->func()

要摆脱虚拟性,您必须为类和函数命名。在更简单的上下文中:

D *d = new D;
d->C::func(); // calls C::func

当您有指向基类型的指针而不是指向派生类型的指针时,您必须将指针转换为具有 C::func 的类型.该转换是用 dynamic_cast 完成的,像这样:

A *p = new D;
dynamic_cast<C*>(p)->C::func();

根据您的编译器,您可能需要稍微修改一下类定义以消除链接器错误。有些编译器对从没有非内联函数的类继承感到困惑。

关于c++ - 带指针的菱形继承(钻石问题)虚拟成员类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244794/

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