我有点困惑我们如何有一个向量来保存指向Statement数据类型对象的指针。但是Statement是一个纯虚函数,据我了解,我们无法从纯虚类实例化对象。我想念什么?
从Statements.hpp
的头文件中:(Statement和Statements都显示在此头文件中)
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;
};
从statement.cpp文件中:
void Statements::addStatement(Statement *statement) { _statements.push_back(statement); }
我有点困惑。让我知道,如果我没有提供足够的代码,我想这就是所有相关的东西。这是交往的一部分。
答案 0 :(得分:10)
Statement
是一个抽象类,这意味着它具有纯虚函数。没错,抽象是意味着不能直接实例化该类的实例。但是,其他类也可以从抽象类派生而来,这些类可能实现所有纯虚函数,因此是具体的。
由于此类层次结构中的子类是基类对象的示例(它是IS-A关系),因此代码可以使用指针或对基类的引用来引用它。
经典示例:如果您有Animal
类,则可以有名为Dog
和Cat
的子类。您可以创建Dog
的实例,并将其放入Animal
的集合中。
(这是相当基本的面向对象理论知识。任何书籍或文章都可以更深入地介绍它。搜索“多态性”,“面向对象程序设计”,“派生类”,“具体子类”或其他百万种组合中的任何一种)