由菱形继承产生的编译错误

菱形继承编译产生两个错误
1、no unique final overrider for(最终重载不唯一)
2、请求有歧义

#include <iostream>

using namespace std;

class A
{
public:
    virtual void f()
    {}
};

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

class C : public A
{
public:
    virtual void f() {}
};

class D : public B, public C
{

/* some code */
};


int main()
{
    D d;
    d.f(); //如果有这行编译就会有问题,f函数有歧义
    return 0;
}

[codetest]$g++ test.cpp
test.cpp: 在函数‘int main()’中:
test.cpp:41:7: 错误:对成员‘f’的请求有歧义
d.f(); //如果有这行编译就会有问题,f函数有歧义
^
test.cpp:15:18: 附注:备选为: ‘virtual void A::f()’
virtual void f()
^
test.cpp:28:18: 附注: ‘virtual void C::f()’
virtual void f() {}
^
test.cpp:22:18: 附注: ‘virtual void B::f()’
virtual void f() {}
^

#include <iostream>

class A
{
public:
    virtual void f()
    {
    }
};

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

class C : virtual public A
{
    virtual void f() {}
};

class D : public B, public C
{
    /* some code */
};


int main()
{
    D d;
    return 0;
}

[codetest]$g++ test01.cpp
test01.cpp:28:7: 错误:‘virtual void A::f()’的最终重载在‘D’中不唯一
class D : public B, public C
^

这里可以从宏观的角度取思考,B重写了A的f函数,C又重写了A的f函数,因为是虚继承,所以D中只会有一份A的f函数,那么问题来了,这一份f是从B来还是从C来?所以就需要在D中重载,保证唯一。要和上面的对成员‘f’的请求有歧义这个编译错误区分开来。上面的D中是有两份f函数的。

上一篇:RabbitMQ概述 与 Mac安装erlang和rabbitmq


下一篇:keepalived 实战