c++ - 抽象基类以基类为类型创建派生类的实例
问题描述
我有一个简单的问题:我有一个抽象的基类,我想将它用作派生类的类型。我的意思是:
class Rule {
public:
//Return value is equal to the count of consumned chars or -1 if the given chars are invalid for this rule
virtual int parse(const std::string& text, unsigned int startIndex) = 0;
};
class OptionalRule : public Rule {
private:
Rule m_rule;
public:
OptionalRule(Rule rule) {
m_rule = rule;
}
};
这给了我以下错误代码:不允许抽象类类型的对象。现在我知道我不能拥有 Rule 的实例,但我想要的是允许 Rule 的任何子类。我该怎么做呢?我知道它与指针有关,但我不太明白它为什么或如何工作。
谢谢你的帮助!
PS:我知道我必须在类 OptionalRule 中实现虚函数,这样我才能实例化它
解决方案
您不能通过Rule
值传递或存储 a,因为它具有纯virutal
成员函数。相反,您需要将 存储Rule
为指针或引用。一个好的起点是使用 a std::unique_ptr
:
class OptionalRule : public Rule {
private:
std::unique_ptr<Rule> m_rule;
public:
OptionalRule(std::unique_ptr<Rule> rule)
: m_rule{std::move(rule)} { }
};
std::shared_ptr<Rule>
如果更适合您的需要,您可以使用另一个智能指针(例如, )。
推荐阅读
- javascript - 为什么当浏览器选项卡不在焦点时我的脚本会中断
- wordpress - 从 SEARCH WP REST API 中排除帖子
- wav - 导出到 32 位而不是 16 位 Web 音频 API
- performance-testing - DRAM 访问的性能计数器
- c++ - 采用这个平凡的类来处理可选值可能会出什么问题?
- prolog - 任何人都可以帮助我理解这个序言程序吗?
- mapbox - 导入标记数据集与动态添加标记到地图
- python - 在python tkinter中配置标签数组时,如何避免TypeError:只能将str(不是“int”)连接到str?
- python - 无法导入我新创建的 python 包(未找到模块)
- c# - 集中放置一个 CollectionView 项目