gpt4 book ai didi

c++ - 虚拟继承 : Error: no unique final overrider

转载 作者:IT老高 更新时间:2023-10-28 22:20:37 29 4
gpt4 key购买 nike

我知道在问这个问题之前和之前这里已经介绍了虚拟继承,我浏览了虚拟继承的详细信息,并浏览了类似问题的详细信息,如下所示:

multiple-diamond-inheritance-compiles-without-virtual-but-doesnt-withwhy does GCC give me an error - final overrider

我的问题略有不同,因为我没有使用纯虚函数,而是显式使用虚拟继承来拥有一个唯一的 base 类。层次结构如下:

   base
/\
/ \
der1 der2
\ /
der3

我知道关于派生问题的可怕钻石,这就是我使用虚拟继承的原因。

#include <iostream>
class base
{
public :

base()
{
std::cout<<"base()" << std::endl;
}
virtual void fun()
{
std::cout<<"base" << std::endl;
}
};

class der1: virtual public base
{
public :
void fun()
{
std::cout<<"der1" << std::endl;
}
};

class der2 : virtual public base
{
public :
void fun()
{
std::cout<<"der2" << std::endl;
}
};

class der3 : public der1,public der2
{
public :
/*void fun()
{
std::cout<<"der3" << std::endl;
}*/
//if I took out the comment and the function
//is defined it compiles fine as expected
};

int main()
{
base *p=new der3;
//used scope operation explicitly to avoid ambiguity
p->base::fun(); //here it complains about 'no unique final overrider for fun'
return 0;
}

我的理解是,由于我使用的是虚拟继承,应该只有一个 base, 的实例,并且使用范围运算符,我可以毫无歧义地调用虚拟 fun 功能。该函数不是纯虚拟的。如果我确实在 der3 类上留下了一个实现,它会给我一个编译器错误:

error: no unique final override for ‘virtual void base::fun()’ in ‘der3’

我可以看到这个问题是如何工作的 (final overrider)。但我的没有。 base::funder1::funder2::fun 是否混淆了?范围运算符有什么帮助吗?

感谢任何线索或帮助。我正在使用 g++ 4.6.3。

最佳答案

最衍生的类必须在虚拟基类中提供虚拟函数的实现 - 否则它如何提供该基类接口(interface),给定中间类(即您的 der1der2) 已经提供了两种选择——它应该调用哪一种?您必须消除这种情况的歧义(即使用 der3::fun())。

确定您实际上并没有调用 der3::fun(),因为您明确地请求 base::fun(),但这并不意味着规则不适用,就像认为如果您不尝试调用纯虚拟函数就可以实例化一个抽象类......该程序是错误的,直到代码将这些松散的末端联系起来。

关于c++ - 虚拟继承 : Error: no unique final overrider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24006199/

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