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

标签 c++ overriding multiple-inheritance virtual-functions virtual-inheritance

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

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/

相关文章:

c# - 派生类中存在重写和隐藏方法。为什么?

c# - 用具体类型覆盖抽象方法的返回类型

java - 覆盖 java...Object 类中的 equals 方法

python - 可以使用 MRO 来覆盖混入吗?

java - java中的多重继承: implementing interfaces

c++ - boost 如何知道要链接哪个 LIB 以及如何更改它?

c++ - 非常基本的文件加密形式?

c++ - 多重继承

c++ - 避免模​​拟 std::fstream 类的 "inheritance by dominance"警告

c++ - 3D vector C++ 的循环帮助