为啥编译器认为这个类是抽象的(C++)?

Posted

技术标签:

【中文标题】为啥编译器认为这个类是抽象的(C++)?【英文标题】:Why does the compiler think this class is abstract (C++)?为什么编译器认为这个类是抽象的(C++)? 【发布时间】:2012-03-19 02:33:40 【问题描述】:

我正在写一些东西来说明命令模式。我已经认识到,对于这个计算器实现,所有二进制操作(加法、减法等)只是在顶部两个堆栈项上“执行”一个操作,所以我试图将该逻辑拉入另一个基类(BinaryCommand )。

我对为什么会收到错误感到困惑(如下面的 main 函数的注释所示)。非常感谢任何帮助!

class ExpressionCommand

public:
    ExpressionCommand(void);
    ~ExpressionCommand(void);

    virtual bool Execute (Stack<int> & stack) = 0;
;


class BinaryCommand : ExpressionCommand

public:
    BinaryCommand(void);
    ~BinaryCommand(void);

    virtual int Evaluate (int n1, int n2) const = 0;

    bool Execute (Stack<int> & stack);
;
bool BinaryCommand::Execute (Stack <int> & s) 

    int n1 = s.pop();
    int n2 = s.pop();
    int result = this->Evaluate (n1, n2);
    s.push (result);
    return true;


class AdditionCommand : public BinaryCommand

public:
    AdditionCommand(void);
    ~AdditionCommand(void);

    int Evaluate (int n1, int n2);
;
int AdditionCommand::Evaluate (int n1, int n2)

    return n1 + n2;



int main()

    AdditionCommand * command = new AdditionCommand(); // 'AdditionCommand' : cannot instantiate abstract class

【问题讨论】:

【参考方案1】:

哎呀,对不起,将“const”添加到派生类修复了它。

【讨论】:

【参考方案2】:

BinaryCommand 是抽象的,因为 virtual int Evaluate (int n1, int n2) const = 0; 被声明为纯的。

AdditionCommand 不会覆盖virtual int Evaluate (int n1, int n2) const = 0;,因此该类缺少纯虚拟成员的定义,因此是抽象的。

int AdditionCommand::Evaluate (int n1, int n2); 不会覆盖virtual int Evaluate (int n1, int n2) const = 0;,而是隐藏它。

【讨论】:

以上是关于为啥编译器认为这个类是抽象的(C++)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不继承 C++ 构造函数?

为啥 c++ 类定义中的公共引用

C++笔记--构造函数(2-1)

为啥不能编译这个 C++ 模板代码?

尽管注释掉了所需的头文件,为啥这个 C++ 程序仍能编译和运行? [复制]

C++ 唯一指针;为啥这个示例代码会出现编译错误?错误代码太长了,我无法指定