c++ - 如何拥有两个同名但返回类型不同的纯虚方法
问题描述
我有一个A
公开可用的接口和一个后端实现类C
,如下所示:
struct A
{
virtual void f() = 0;
};
struct C : public A
{
virtual void f() override
{
}
};
我想逐步迁移到新界面,B
. B
将具有相同的方法,但是返回类型可能不同。我希望我的实现类同时实现这两者A
,B
以便遗留代码可以继续使用A
直到它被迁移,但新代码可以用B
. 我知道如果我有两个签名完全相同的纯虚方法,我只需要在我的实现类中重写一个。但是如果它们的返回类型不同,我不知道该怎么做......
struct A
{
virtual void f() = 0;
};
struct B
{
virtual int f() = 0;
};
struct C : public A, public B
{
// How do I implement both versions of f() here??
};
解决方案
这至少与 VS2017 一起编译:
struct A
{
virtual void f() = 0;
};
struct A2: public A
{
void f() { Af(); }
virtual void Af() = 0;
};
struct B
{
virtual int f() = 0;
};
struct B2 : public B
{
int f() { return Bf(); }
virtual int Bf() = 0;
};
struct C : public A2, public B2
{
void Af() {}
int Bf() { return 42; }
};
编辑:无法对 Paul Accisano 自己的答案添加评论,所以我把它放在这里。
稍微修改保罗的答案。通过使未使用的默认参数成为受保护的类,您仍然可以进行正确的类型检查,并避免与另一个成员函数发生类型冲突的可能性。
struct A
{
virtual void f() = 0;
};
struct B
{
protected:
class disambiguator {};
public:
virtual int f(disambiguator ignoreMe = disambiguator()) = 0;
};
struct C : public A, public B
{
virtual void f() override {}
virtual int f(disambiguator ignoreMe) override { return 42; }
};
A *createA() { return new C; }
B *createB() { return new C; }
一个应用程序可能是从原始指针逐渐迁移到智能指针。
推荐阅读
- ansible - 无法使用 ansible 安装 Citrix VDA 代理
- javascript - JavaScript:parseFloat() 去除尾随零
- sqlite - python tkinter sqlite3的问题
- python - 使用python将所有缺失的日期范围添加到数据框
- c# - 具有泛型类型的可空默认参数
- javascript - 如何区分javascript jquery中的偶数/奇数日期
- ruby-on-rails - 如何在我的 Ruby on Rails 应用程序中读取 JS 文件?
- javascript - 拒绝连接到 URL,因为它违反了 CSP
- java - Spring Batch 将数据从 writer 传递到下一个作业或步骤
- sftp - Azure 逻辑应用 SFTP-SSH 创建操作中的分块不起作用