Определение нескольких производных членов интерфейса

Я надеюсь, что вы можете помочь мне решить следующую проблему. Я пытаюсь создать гибкую систему интерфейсов и столкнуться с проблемой. Это соответствующий код:

// Interface 1
//      this: virtual f_a
// -> abstract
struct I_A abstract
{
    virtual void f_a() = 0;
};

// Interface 2
//      I_A : virtual f_a
//      this: virtual f_b
// -> abstract
struct I_B abstract : public I_A
{
    virtual void f_b() = 0;
};

// Implementation 1
//      I_A : virtual f_a
//      zhis: defines f_a
// -> not abstract
struct S_A : public I_A
{
    virtual void f_a() {}
};

// Implementation 2
//      I_B : virtual f_a
//      I_B : virtual f_b
//      S_A : defines f_a
//      this: defines f_b
// -> not abstract
struct S_B : public I_B, public S_A
{
    virtual void f_b() {}
};

Я не могу создать экземпляр S_B, потому что компилятор утверждает, что он абстрактный. Что случилось?

1 ответ

Решение

Вам нужно использовать виртуальное наследование здесь:

struct I_A
{
    virtual void f_a() = 0;
};

struct I_B : virtual public I_A
{
    virtual void f_b() = 0;
};


struct S_A : virtual public I_A
{
    virtual void f_a() {}
};

Примечание 1: я игнорирую ваши abstract операторы в объявлениях класса, так как это не стандарт C++.

Примечание 2: здесь есть копия этого, где вы можете найти объяснения, почему это происходит.

Другие вопросы по тегам