【问题标题】:Implementing multiple interfaces with same method names and varying parameters in C++在 C++ 中实现具有相同方法名称和不同参数的多个接口
【发布时间】:2019-06-08 02:32:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你的函数不需要这样标记: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() { }
    };
    

    【讨论】:

    • 这不能在 clang-900.0.39.2 上编译。您在哪些编译器上尝试过此代码?
    • onlinegdb.com/online_c++_compiler 但您需要保留 using 命名空间 std 并可能包含
    猜你喜欢
    • 2011-07-26
    • 2011-11-23
    • 1970-01-01
    • 2013-07-03
    • 2015-03-11
    • 2015-10-19
    • 1970-01-01
    • 2022-01-22
    • 2011-01-23
    相关资源
    最近更新 更多