我有一个简单的问题:我有一个抽象的基类,我想用它作为派生类的类型。我的意思是:
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
的值,因为它有纯virutal
成员函数。相反,您需要将Rule
存储为指针或引用。一个好的起点是使用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>
),如果它更符合你的需要。