在C ++中使用相同的方法名称和不同的参数实现多个接口

时间:2019-01-14 04:33:15

标签: c++ visual-c++ com g++ clang

我正在尝试用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 ++特定的行为吗?

1 个答案:

答案 0 :(得分:2)

无需将您的函数标记为: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() { }
};