Реализация нескольких интерфейсов с одинаковыми именами методов и различными параметрами в C ++ - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать класс в 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 голосов
/ 14 января 2019

Нет необходимости отмечать ваши функции так: 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() { }
};
...