c++ - 创建抽象基类型引用的初始化列表
问题描述
我有两个类 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 类型?
我该如何克服呢?
谢谢 :)
解决方案
您的代码有一些问题:
你应该有一个公共的析构函数/构造函数
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;
}
推荐阅读
- dart - 在平面图上放置点的建议
- http - 无法使用证书身份验证将 Microsoft Flows 与 HTTP 请求连接
- r - R dplyr:使用自定义函数的逐行操作
- python - 如何使用默认和非托管数据库运行 Django 单元测试?
- elasticsearch - elasticsearch 术语聚合查询不返回任何结果
- node.js - 如何从 Electron 渲染器进程内存转储中清理敏感的 Node.js 缓冲区?
- twilio - 如何通过 php 中的 CURL 使用 twillo 通知 API 发送批量消息?
- jqgrid - 遍历 jqGrid 更新一列的每一行
- django - Django - 按品牌和其他特征过滤类别中的产品
- mongodb - 带有 Docker 的“服务器选择超时错误”MongoDB Go 驱动程序