gpt4 book ai didi

c++ - 为什么 GCC 给我一个错误 : no unique final overrider?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:31 25 4
gpt4 key购买 nike

在下面的代码中,我收到以下警告和错误:

test.cpp:15: warning: direct base 'B' inaccessible in 'D' due to ambiguity
test.cpp:15: error: no unique final overrider for 'virtual void A::f()' in 'D'

但是如果我从 A 中移除 B 的虚拟继承(即 struct B : public A),我只会得到警告,没有错误。

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

struct B : public virtual A
{
void f() {}
};

class C : public B
{};

struct D : public C, virtual B
{};

int main()
{
return 0;
}

为什么?这是可怕的钻石吗?

最佳答案

这是因为 C 以非虚拟方式继承自 BD 以虚拟方式继承自 B。这给你 B 两次,包括两次 f()

尝试在 C 中虚拟继承 B

更新:那么,当您从 A 中删除 B 中的虚拟继承时,为什么它会起作用?因为它改变了“最终覆盖者”。在 ABBC 中没有 virtual 你有 A 两个次:一次在 C 中(在 B 中对 f() 进行最终覆盖)一次在虚拟 B 中> 在 D 中(在 B 中最终覆盖了 f())。如果将 B 中的虚拟继承添加回 AA 将只出现一次,并且将有两个最终覆盖竞争实现A 中的纯 f(),都在 B 中,一次来自 C,一次来自虚拟 B.

作为解决方法,您可以向 D 添加 using,即 using C::f;using B::f

参见 C++ 10.3/2

关于c++ - 为什么 GCC 给我一个错误 : no unique final overrider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19712539/

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