2012-03-19 3 views
0

Я пишу что-то, чтобы проиллюстрировать шаблон команды. Я признал, что для этой реализации калькулятора все двоичные операции (сложение, вычитание и т. Д.) Просто «Выполняют» операцию над двумя верхними элементами стека, поэтому я попытался вывести эту логику в другой базовый класс (BinaryCommand).Почему компилятор считает этот класс абстрактным (C++)?

Я смущен, почему я получаю сообщение об ошибке (показано как комментарий к основной функции ниже). Любая помощь очень ценится!

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 
} 

ответ

0

Eek, извините, ребята, добавив 'const' к производному классу, зафиксировав его.

0

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;, но скрывает его.

Смежные вопросы