首页 > 解决方案 > 抽象基类以基类为类型创建派生类的实例

问题描述

我有一个简单的问题:我有一个抽象的基类,我想将它用作派生类的类型。我的意思是:

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 中实现虚函数,这样我才能实例化它

标签: c++classabstract

解决方案


您不能通过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>如果更适合您的需要,您可以使用另一个智能指针(例如, )。


推荐阅读