C++ 作为数据类型出现的纯虚拟类?

C++ 作为数据类型出现的纯虚拟类?,c++,C++,我有点困惑,为什么我们有一个向量,它似乎保存着指向语句数据类型对象的指针。但语句是一个纯虚拟函数,据我所知,我们不能从纯虚拟类实例化对象。我错过了什么 从Statements.hpp的头文件中:(此头文件中同时显示了语句和语句) 我有点困惑。如果我没有提供足够的代码,请告诉我,我认为这是所有相关的内容。它是interpeter的一部分。语句是一个抽象类,这意味着它具有纯虚拟函数。您是对的,抽象意味着该类的实例不能直接实例化。但是,其他类可以从抽象类派生,这些类可能实现所有纯虚函数,因此是具体的

我有点困惑,为什么我们有一个向量,它似乎保存着指向语句数据类型对象的指针。但语句是一个纯虚拟函数,据我所知,我们不能从纯虚拟类实例化对象。我错过了什么

Statements.hpp
的头文件中:(此头文件中同时显示了语句和语句)


我有点困惑。如果我没有提供足够的代码,请告诉我,我认为这是所有相关的内容。它是interpeter的一部分。

语句是一个抽象类,这意味着它具有纯虚拟函数。您是对的,抽象意味着该类的实例不能直接实例化。但是,其他类可以从抽象类派生,这些类可能实现所有纯虚函数,因此是具体的

因为这个类层次结构中的子类是基类对象的一个例子(它是一个is-a关系),所以代码可以使用指向基类的指针或引用来引用它

经典示例:如果您有一个
Animal
类,则可以有名为
Dog
Cat
的子类。您可以创建
的实例,并将它们放入
动物
的集合中


(这是非常基本的面向对象理论内容。任何书籍或文章都会对其进行更深入的介绍。搜索“多态性”、“面向对象编程”、“派生类”、“具体子类”或任何其他一百万种组合。)

在您的项目或您使用的库中,必须有一个(或多个)“非虚拟的”扩展
语句
并实现虚拟方法的类。如果一个类是从
语句
公开派生的,并重写所有继承的纯虚拟函数,则可以实例化该类。而
语句*
可以指向该派生类的有效实例。查找多态性以了解更多信息。这里没有矛盾。语句是一个抽象类(它不是您暗示的函数)。不能创建语句类的对象,但可以创建实现所有纯虚函数的派生类型的对象。您可以使用指向基类(语句)的指针引用这些派生对象。这是多态性的基础。
class Statement {
public:
    Statement();

    virtual void print() = 0;
    virtual void evaluate(SymTab &symTab) = 0;

};

class Statements {
public:
    Statements();

    void addStatement(Statement *statement);
    void evaluate(SymTab &symTab);

    void print();

private:
    std::vector<Statement *> _statements;
};
void Statements::addStatement(Statement *statement) { _statements.push_back(statement); }