C++ 解决跨基类的虚拟方法重载
Visual Studio 2013 鉴于: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 ¶
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 ¶m)
{
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 ¶m)
{
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;
};