C++ 解决跨基类的虚拟方法重载

C++ 解决跨基类的虚拟方法重载,c++,multiple-inheritance,name-lookup,ambiguous-call,C++,Multiple Inheritance,Name Lookup,Ambiguous Call,Visual Studio 2013 鉴于: class base_1 { public: virtual void foo(int) = 0; }; class base_2 { public: virtual void foo(int, double) = 0; }; class join_1_2 : public virtual base_1, public virtual base_2 {}; 我有一个水槽: void sink(join_1_2 &para

Visual Studio 2013

鉴于:

class base_1
{
public:
    virtual void foo(int) = 0;
};

class base_2
{
public:
    virtual void foo(int, double) = 0;
};

class join_1_2 : public virtual base_1, public virtual base_2
{};
我有一个水槽:

void sink(join_1_2 &param)
{
    param.foo(42, 3.14);
}
但我发现以下编译器错误:

错误C2385:对“foo”的访问不明确

可能是base_1中的“foo”

或者可能是base_2中的“foo”

错误C2660:'base_1::foo':函数不接受2个参数

错误C3861:“foo”:找不到标识符

我知道我可以通过以下方式解决此问题:

param.base_2::foo(42, 3.14);
但正如你所能想象的,虚拟继承已经是我不得不忍受的一种罪过。我可能要写一个适配器。但我不明白是什么阻止编译器尝试在base_2中解析foo。我的同事认为这是一个编译器错误,但我并没有那么快去责怪供应商


< C++ >关于在基类上解决重载虚拟方法的说明什么?

根据标准,这确实是模糊的,但是可以使用<代码>使用< /代码>或明确地指定基类:

class join_1_2 : public virtual base_1, public virtual base_2
{
public:
    using base_1::foo;
    using base_2::foo;
};

void sink(join_1_2 &param)
{
    param.base_2::foo(42, 3.14);
}
7.3.3使用声明

为了解决重载问题,由using声明引入到 派生类将被视为派生类的成员


经验法则是不同作用域中的函数不会过载-这里我们的
foo
s在不同的作用域中。如果希望它们重载,则需要使用以下using声明将它们引入:


1.你能提供一些规则的引用吗。?2.在没有类成员查找/多重继承的情况下,有没有其他方法可以获得这种情况。?
class join_1_2 : public virtual base_1, public virtual base_2
{
public:
    using base_1::foo;
    using base_2::foo;
};