首页 > 解决方案 > 创建抽象基类型引用的初始化列表

问题描述

我有两个类 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”的对象</p>

为什么要尝试分配 Abs 类型?

我该如何克服呢?

谢谢 :)

标签: c++initializer-list

解决方案


您的代码有一些问题:

  • 你应该有一个公共的析构函数/构造函数

  • B 不从 Abs 继承,因此 in 不能转换为 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;
}

推荐阅读