我知道在问这个问题之前和之前这里已经介绍了虚拟继承,我浏览了虚拟继承的详细信息,并浏览了类似问题的详细信息,如下所示:
multiple-diamond-inheritance-compiles-without-virtual-but-doesnt-with 和 why 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::fun
、der1::fun
和 der2::fun
是否混淆了?范围运算符有什么帮助吗?
感谢任何线索或帮助。我正在使用 g++ 4.6.3。
最佳答案
最衍生的类必须在虚拟基类中提供虚拟函数的实现 - 否则它如何提供该基类接口(interface),给定中间类(即您的 der1
和 der2
) 已经提供了两种选择——它应该调用哪一种?您必须消除这种情况的歧义(即使用 der3::fun()
)。
确定您实际上并没有调用 der3::fun()
,因为您明确地请求 base::fun()
,但这并不意味着规则不适用,就像认为如果您不尝试调用纯虚拟函数就可以实例化一个抽象类......该程序是错误的,直到代码将这些松散的末端联系起来。
关于c++ - 虚拟继承 : Error: no unique final overrider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24006199/