首页 > 解决方案 > 如何拥有两个同名但返回类型不同的纯虚方法

问题描述

我有一个A公开可用的接口和一个后端实现类C,如下所示:

struct A
{
    virtual void f() = 0;
};

struct C : public A
{
    virtual void f() override
    {
    }
};

我想逐步迁移到新界面,B. B将具有相同的方法,但是返回类型可能不同。我希望我的实现类同时实现这两者AB以便遗留代码可以继续使用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??
};

标签: c++overloadingmultiple-inheritancepure-virtual

解决方案


这至少与 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; }

一个应用程序可能是从原始指针逐渐迁移到智能指针。


推荐阅读