Создание списка инициализации абстрактных ссылок базового типа - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть два класса A, B, которые наследуются от абстрактного базового класса Abs. Я хотел бы создать список инициализации, содержащий их обоих. Я хотел бы повторить этот список с циклом foreach.

class Abs {
    public:
    virtual ~Abs() = default;
    virtual void f() = 0;
};

class A : public Abs {
    virtual void f() override;
};

class B : public Abs {
    virtual void f();
};

int main() {
    A a;
    B b;
    const Abs& a_abs = a;
    const Abs& b_abs = b;

    for (const auto& abs : {a_abs, b_abs})
    {
    }

    return 0;
}

Сбой компиляции цикла for:

ошибка: невозможно выделить объект абстрактного типа "Абс"

Почему он пытается выделить тип Abs?

Как я могу преодолеть это?

Спасибо:)

1 Ответ

0 голосов
/ 30 апреля 2018

в вашем коде было несколько ошибок:

  • у вас должен быть публичный деструктор / конструктор

  • B не наследуется от Abs, поэтому не может быть преобразовано в Abs

Я не знаю, можете ли вы получить то, что вы хотите, с помощью ссылок, но с указателями вы можете. пожалуйста, используйте умный указатель, это просто понятие о

#include <initializer_list>
#include <iostream>

class Abs {
    public:
    virtual ~Abs() = default;
    virtual void f() const = 0;
};

class A : public Abs {
    public:
    virtual void f() const {
        std::cout << "A" << std::endl;
    }
};

class B : public Abs {
    public:
    virtual void f() const {
        std::cout << "B" << std::endl;
    }
};

int main() {
    A* a = new A();
    B* b = new B();
    const Abs* a_abs = dynamic_cast<const Abs *>(a);
    const Abs* b_abs = dynamic_cast<const Abs *>(b);

    for (const auto* abs : {a_abs, b_abs})
    {
        abs->f();
    }
    delete a;
    delete b;
    return 0;
}
...