c++ - 在 C++ 中实现具有相同方法名称和不同参数的多个接口
问题描述
我正在尝试在 C++ 中创建一个类,该类实现具有相同方法名称但具有不同签名的多个接口。
#include <string>
#include <iostream>
using namespace std;
class IA {
public:
virtual void method(int i) = 0; // Signature is different from IB::method
virtual ~IA() { }
};
class IB {
public:
virtual void method(const string& s) = 0; // Signature is different from IA::method
virtual ~IB() { }
};
class MyClass : public IA, public IB {
virtual void IA::method(int i) {
cout << "IA::method " << i << endl;
}
virtual void IB::method(const string& s) {
cout << "IB::method " << s << endl;
}
virtual ~MyClass() { }
};
此类使用 Visual C++ 2017 编译。但是,我想将方法实现与类头分开,但将实现移到类声明之外会导致编译错误。
例如,这不起作用:
class MyClass : public IA, public IB {
virtual void IA::method(int i);
virtual void IB::method(const string& s);
virtual ~MyClass() { }
};
void MyClass::IA::method(int i) {
cout << "IA::method " << i << endl;
}
void MyClass::IB::method(const string& s) {
cout << "IB::method " << s << endl;
}
Visual C++ 2017 报告此错误:
“C2509 方法:成员函数未在 'MyClass' 中声明”
出于好奇,我使用其他编译器(g++ 和 clang)编译了这两个类声明,但它们都无法编译。
这是一些 Visual C++ 特定的行为吗?
解决方案
无需将您的功能标记为:IA::method
区别是由签名的调用部分完成的。
class IA {
public:
virtual void method(int i) = 0; // Signature is different from IB::method
virtual ~IA() { }
};
class IB {
public:
virtual void method(const string& s) = 0; // Signature is different from IA::method
virtual ~IB() { }
};
class MyClass : public IA, public IB {
public:
void method(int i) override { // No need for IA::method
cout << "IA::method " << i << endl;
}
void method(const string& s) override { // No need for IB::method
cout << "IB::method " << s << endl;
}
virtual ~MyClass() { }
};
推荐阅读
- java - 如何通过编译java文件来修复错误
- jdbc - jdbc.connection.getmetadata() 如何更新
- windows-10 - 使用 Intune 加入 Azure AD 时计算机独有的本地管理员
- ruby-on-rails - Rails API:Netflix fast_jsonapi 和 Rails 渲染 - 双数据
- linux - 为什么'wget --page-requisites'非常慢
- vue.js - Vue3 自动前缀配置问题
- python - 如何在条件下通过另一个脚本杀死一个python脚本
- swift - 设计模式问题:当扩展和协议失败时
- node.js - Selenium 不会在无头模式下启动 chrome,无论我做什么
- erlang - 如何从 erlang 中的元组列表中访问一个值并从中创建一个新列表?