#include <iostream>
using namespace std;
class travel{
public:
virtual void travel_method() = 0;
virtual ~travel(){}
};
class travel_with_plane:public travel{
public:
void travel_method(){
cout<<"travel_with_plane"<<endl;
}
~travel_with_plane()
{
cout<<"travel_with_plane::~travel_with_plane()"<<endl;
}
};
class travel_with_train : public travel{
public:
void travel_method(){
cout<<"travel_with_train"<<endl;
}
~travel_with_train()
{
cout<<"travel_with_train::~travel_with_train()"<<endl;
}
};
class person{
public:
person():ptra(NULL)
{
}
void set_travel(travel * tra){
if(ptra != NULL){
delete ptra;
ptra = NULL;
}
ptra = tra;
}
void go_travel(){
if(ptra != NULL)
ptra->travel_method();
}
~person(){
if(ptra != NULL)
delete ptra;
}
private:
travel * ptra;
};
int main()
{
person per;
per.set_travel(new travel_with_plane);
per.go_travel();
per.set_travel(new travel_with_train);
per.go_travel();
return 0;
}
//
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Operation
{
public:
virtual ~Operation(){}
virtual double operate() = 0;
void setNum1(double value){ m_fNum1 = value; }
void setNum2(double value){ m_fNum2 = value; }
protected:
double m_fNum1;
double m_fNum2;
};
class AddOperation : public Operation
{
public:
double operate()
{
return m_fNum1 + m_fNum2;
}
};
class SubOperation : public Operation
{
public:
double operate()
{
return m_fNum1 - m_fNum2;
}
};
class MultiOperation : public Operation
{
public:
double operate()
{
return m_fNum1 * m_fNum2;
}
};
class DivOperation : public Operation
{
public:
double operate()
{
if (m_fNum2 < 0.000001)
{
cout<< "除数不能为零!" <<endl;
return 0;
}
return m_fNum1 / m_fNum2;
}
};
class OperationContext
{
public:
OperationContext(char c)
{
switch(c)
{
case '+':
m_pOperation = new AddOperation();
break;
case '-':
m_pOperation = new SubOperation();
break;
case '*':
m_pOperation = new MultiOperation();
break;
case '/':
m_pOperation = new DivOperation();
break;
default:
break;
}
}
double GetResult(double num1, double num2)
{
m_pOperation->setNum1(num1);
m_pOperation->setNum2(num2);
return m_pOperation->operate();
}
~OperationContext()
{
delete m_pOperation;
}
private:
Operation *m_pOperation;
};
int main()
{
OperationContext oContext('-');
cout<<oContext.GetResult(99, 773)<<endl;;
OperationContext oContext1('*');
cout<<oContext1.GetResult(99, 773)<<endl;;
return 0;
}