【问题标题】:Abstract Base Class create instance of derived class with Base class as type抽象基类以基类为类型创建派生类的实例
【发布时间】:2021-02-25 14:35:01
【问题描述】:

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

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++ class abstract


【解决方案1】:

您不能按值传递或存储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&lt;Rule&gt;)。

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2015-03-23
    • 2014-09-29
    • 2011-11-05
    • 2011-02-20
    • 2017-06-21
    • 2015-08-10
    • 2013-06-30
    • 2013-08-30
    相关资源
    最近更新 更多