Реализация интерфейсов по наследству - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть общий интерфейс, который наследуют многие классы в моем проекте (FWIW - это интерфейс пересчета).Этот интерфейс наследуется как классами, так и другими интерфейсами.Вместо того, чтобы повторно реализовывать интерфейс в каждом классе, я хотел бы просто иметь соответствующий класс реализации, который наследуют все другие классы.Проблема в том, что его разметка приводит к смерти ».

struct IBar {
    virtual VOID Bar() = 0;
};

struct CBar : IBar { // implementation class for IBar
    VOID Bar() { }
};

struct IFooBar : IBar {
    virtual VOID Foo() = 0;
};

struct CFooBar : IFooBar, CBar { // implementation of IFooBar interface
    VOID Foo() { }
    // Bar() should be implemented by the inheritance of CBar
};

Если я пытаюсь скомпилировать, я получаю следующую ошибку:

error C2259: 'CFooBar' : cannot instantiate abstract class
1>          due to following members:
1>          'void IBar::Bar(void)' : is abstract

IПонимаю, что я могу это исправить, реализовав CFooBar::Bar() { return CBar::Bar(); } или получив IFooBar наследование от CBar, но я подозреваю, что есть менее хакерский способ решения этой проблемы.Любые предложения будут с благодарностью.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Вы всегда можете попробовать , фактически наследуя от IBar. Таким образом, вы исключаете посредника, так сказать, и всегда напрямую наследуете его, независимо от того, наследуете ли вы также от одного из его потомков.

Например:

class IBar {
    public:
    virtual void Bar() = 0;
};

class CBar : public virtual IBar { // implementation class for IBar
    public:
    void Bar() { printf("bar\n");}
};

class IFooBar : public virtual IBar {
    public:
    virtual void Foo() = 0;
};

class CFooBar : public IFooBar, public CBar { // implementation of IFooBar interface
    public:
    void Foo() { }
    // Bar() should be implemented by the inheritance of CBar
};

int main(int argc, char *argv[])
{
    CFooBar cfb;

    cfb.Bar( );

    system("PAUSE");
    return EXIT_SUCCESS;
}

Я бы всегда рекомендовал использовать class вместо struct, если вы пишете какие-либо функции-члены - такая вещь, в конце концов, по определению является классом. Кроме того, стоит явно установить модификаторы доступа, как в моем примере (приведенный выше код фактически не компилируется без их добавления).

0 голосов
/ 25 февраля 2011

Вы пробовали декларацию using CBar::Bar;?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...