Re: inheritance, list of objects, polymorphism
"James Kanze" <james.kanze@gmail.com> ha scritto nel messaggio
news:d3cde4c3-dd7d-473b-b71d-b82fcef30e26@o28g2000yqh.googlegroups.com...
Somehow, I don't think you've understood what is going on.
yes i'm not so smart, but how to use all this?
why declare all distructors "virtual" ?
why use all that "const"?
#include <iostream>
#include <list>
#include <string>
using namespace std;
// Interface...
class Expression{
public:
Expression(){}
Expression( Expression& );
Expression& operator=( Expression& );
virtual ~Expression() {}
virtual double value() = 0;
// other functions...?
};
class OneOperandExpression : public Expression
{public:
Expression* m_op;
OneOperandExpression( Expression* op ):m_op( op ){}
virtual ~OneOperandExpression() { delete m_op; }
};
class TwoOperandExpression : public Expression{
public:
Expression* m_lhs;
Expression* m_rhs;
TwoOperandExpression( Expression* lhs, Expression* rhs )
:m_lhs( lhs ),m_rhs( rhs ){}
virtual ~TwoOperandExpression() { delete m_lhs; delete m_rhs; }
};
class ConstantExpression : public Expression{
public:
double m_value;
ConstantExpression( double value ):m_value( value ){}
virtual double value(){return m_value;}
};
class NegExpression : public OneOperandExpression{
public:
NegExpression( Expression* op ):OneOperandExpression(op){}
virtual double value(){return - m_op->value();}
};
class AddExpression : public TwoOperandExpression{
public:
AddExpression( Expression* lhs, Expression* rhs )
:TwoOperandExpression( lhs, rhs ){}
virtual double value(){return m_lhs->value() + m_rhs->value();}
};
class MulExpression : public TwoOperandExpression{
public:
MulExpression(Expression* lhs, Expression* rhs)
:TwoOperandExpression( lhs, rhs ){}
virtual double value(){return m_lhs->value() * m_rhs->value();}
};
int main(void)
{// Expression x(3), y(4), z(5);
MulExpression xy(3,4), yz(5,9);
AddExpression p;
cout << xy.value() << "\n";
p.add( xy );
cout << "pvalue=" <<p.value() << "\n";
p.add( yz );
p.add( z );
cout << p.value() << "\n";
p.add(xy);
return 0;
}