【问题标题】:Virtual inheritance ambiguous function [duplicate]虚拟继承模糊函数[重复]
【发布时间】:2016-07-02 09:01:54
【问题描述】:

我有这部分代码

#include <iostream>
using namespace std;
class A {
public:
int i;
    A(){i = 0; }
    virtual void f() { cout << i; }
};
class B1 : virtual public A {
public:
    B1() { f(); }
    void f() { cout << i+10; }
};
class B2 : virtual public  A {
public:
    B2() { f(); }
    void f() { cout << i+1; }
};
class C : public B1, public B2 {
public:
    C() {}
};
void main(){
    C c;
    //c.A::f();
}

首先,我了解使用虚拟继承(菱形)在内存中只创建一个A 对象的主要思想。

在此示例中,我在 C 类中遇到编译错误:

override of virtual function "A::f" is ambiguous

如果我删除 virtual 继承。代码编译,C 类中没有错误。

如果我从最后一个代码行中删除注释,它仍然可以编译。我知道在这种情况下,将执行的 f() 函数是 C 继承自的第一个类中的函数。

现在,如果我将 c.A::f() 替换为 c.f(),我会在此特定行收到编译错误。

有人可以解释一下这种行为以及这些案例之间的区别吗?

【问题讨论】:

  • 谁说跑题了???这只是重复。

标签: c++ multiple-inheritance


【解决方案1】:

问题在于C 而不是您的表达式调用。由于f 是虚拟的,并且在B1B2 中重新定义了两次,因此C 类的格式不正确,因为对f 的调用会不明确(要选择哪个覆盖?)。在C 中添加f 的覆盖,一切都会好起来的。

【讨论】:

    【解决方案2】:

    在 C 类中,您必须选择 f 到 usr 的哪个变体。即using B1::f;using B2::f

    【讨论】:

    • 我知道如何让它发挥作用,但我正在努力理解这种行为的概念和原因。
    • 原因是它在两个基类中看到了两个冲突的定义,但它不知道是哪个。我的解决方案说明了您希望它使用哪一个。
    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2015-06-21
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多