在C++中继承时重载方法
Methods overloading while inheritance in C++
我有一个遗留代码:
struct Iface1
{
virtual ~Iface1() {}
virtual void foo(const int arg1) const = 0;
};
struct Iface2
{
virtual ~Iface2() {}
virtual void foo(const int arg1, const int arg2) const = 0;
};
/// Composite interface
struct Iface12 : Iface1, Iface2
{
};
我需要为复合接口创建一个装饰器。以下代码甚至没有编译,因为G++和MSVC推断调用哪种类型的foo()是"不明确的"。有人能告诉我如何编译下面的代码并使其工作吗?(不幸的是,我没有时间进行重构)。
我甚至不明白为什么编译器不能推断出该调用什么函数,因为所有函数签名都是显式的。谢谢
struct IfaceDecorator : Iface12
{
IfaceDecorator(Iface12& iface) : impl(iface) {}
virtual void foo(const int arg1) const
{
impl.foo(arg1);
}
virtual void foo(const int arg1, const int arg2) const
{
impl.foo(arg1, arg2);
}
private:
Iface12& impl;
};
您需要将foo
显式导入到Iface12
类中,因此您将获得两个重载函数Iface12::foo
。
struct Iface12 : Iface1, Iface2
{
using Iface1::foo;
using Iface2::foo;
};
具有相同名称的成员函数只有在同一类中声明时才会相互重载,如果要重载继承的函数,则需要通过using ParentClass::functionName
将名称导入当前类中。我认为这是最不令人惊讶的原则-除非你要求,否则你的成员函数不会过载。
如果问题在要impl的消息中,您可以使用进行修复
impl.Iface1::foo( arg1 );
// ...
impl.Iface2::foo( arg1, arg2 );
等等
编辑:我已经测试过了,模糊性已经结束了。
相关文章:
- 重载方法的方式会在使用临时调用时生成编译器错误
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 使用 nullptr 调用重载方法是不明确的
- 具有重载方法的可变参数数据结构
- C++11 重载方法,并转发到唯一方法
- 获取特定的模板重载方法指针
- std::result_of 应用于 const 重载方法
- 重载方法的类接受模板和基类 - 如何默认某个方法
- 推导模板类重载方法的地址会导致"error: expected primary-expression before ‘decltype’"
- C++如何使用按值传递和按引用传递的重载方法
- 具有原始方法参数派生类的 C++ 重载方法参数
- SWIG:在派生类中处理基类重载方法
- 在c++中的赋值运算符重载方法中删除旧的动态分配内存
- C++选择'wrong'默认参数的重载方法
- 重写重载方法会隐藏一些重载
- 在C++中,如何从父类变量的子类调用重载方法
- 所有重载方法的别名
- 使用 SWIG 在重载C++方法中设置类型