hello:

i am trying to reimplement the HF state DP in a new example c++ 2008:
I am almost done, but it seem that polymorphism somehow is not working!
this is the code:

this FSM.h
include <iostream>
#include <string.h>

class VendingMachine;

class State {
public:
virtual ~State() = 0 {}
virtual std::string nickel() const = 0;
virtual std::string dime() const = 0;
virtual std::string quarter() const = 0;
};

class startState : public State {
private:
VendingMachine *vendingmachine;
startState( const startState& ); // Disable copy constructor
void operator=( const startState& ); // Disable assignment operator

public:
startState(VendingMachine *vendingmachine);
std::string nickel();
std::string dime();
std::string quarter();
std::string toString();
};

class fiveState : public State {

private:
VendingMachine *vendingmachine;
fiveState( const fiveState& ); // Disable copy constructor
void operator=( const fiveState& ); // Disable assignment operator

public:
fiveState(VendingMachine *vendingmachine);
std::string nickel();
std::string dime();
std::string quarter();
std::string toString();
};

class tenState : public State {

private:
VendingMachine *vendingmachine;
tenState( const tenState& ); // Disable copy constructor
void operator=( const tenState& ); // Disable assignment operator

public:
tenState(VendingMachine *vendingmachine);
std::string nickel();
std::string dime();
std::string quarter();
std::string toString();
};

class twentyState : public State {
private:
VendingMachine *vendingmachine;
twentyState( const twentyState& ); // Disable copy constructor
void operator=( const twentyState& ); // Disable assignment operator

public:
twentyState(VendingMachine *vendingmachine);
std::string nickel();
std::string dime();
std::string quarter();
std::string toString();
};

class VendingMachine {
private:
State *startstate;
State *fivestate;
State *tenstate;
State *fifteenstate;
State *twentystate;
State * _state;

public:
VendingMachine();
void setState(State *state) ;
std::string nickel();
std::string dime();
std::string quarter();
State* getState();
State* getstartState();
State* getfiveState();
State* gettenState();
State* getfifteenState();
State* gettwentyState();
void tito();
};

//---------------------------------------------
std::string VendingMachine::nickel() {
return _state->nickel();
}

//---------------------------------------------
std::string VendingMachine::dime() {
return _state->dime();
}

//---------------------------------------------
std::string VendingMachine::quarter() {
return _state->quarter();
}

//---------------------------------------------
void VendingMachine::setState(State *state) {
_state = state;
}

//---------------------------------------------
State* VendingMachine::getState() {
return _state;
}

//---------------------------------------------
State* VendingMachine::getstartState() {
return startstate;
}

//---------------------------------------------
State* VendingMachine::getfiveState() {
return fivestate;
}

//---------------------------------------------
State* VendingMachine::gettenState() {
return tenstate;
}

//---------------------------------------------
State* VendingMachine::getfifteenState() {
return fifteenstate;
}

//---------------------------------------------
State* VendingMachine::gettwentyState() {
return twentystate;
}

//---------------------------------------------
VendingMachine::VendingMachine( ) {

startstate = new startState( this ); <------------here is the problem (comment this out and the abstract instantiation error disapears! obviously i need this to get polymorphic functionality)
//fivestate = new fiveState(this);
//tenstate = new tenState(this);
//fifteenstate = new fifteenState(this);
//twentystate = new twentyState(this);

//_state = startstate;
}


//---------------------------------------------
startState::startState(VendingMachine *vendingmachine) : vendingmachine( vendingmachine ) {
this->vendingmachine = vendingmachine;
}

//---------------------------------------------
std::string startState::nickel(){
vendingmachine->setState(vendingmachine->getfiveState());

return "";
}

//---------------------------------------------
std::string startState::dime(){
vendingmachine->setState(vendingmachine->gettenState());

return "";
}

//---------------------------------------------
std::string startState::quarter(){
vendingmachine->setState(vendingmachine->getstartState());

return "dispense";
}

//---------------------------------------------
std::string startState::toString() {
return "estado start";
}

//---------------------------------------------
fiveState::fiveState(VendingMachine *vendingmachine) : vendingmachine( vendingmachine ) {
this->vendingmachine = vendingmachine;
}

//---------------------------------------------
std::string fiveState::nickel() {
vendingmachine->setState(vendingmachine->gettenState());

return "";
}

//---------------------------------------------
std::string fiveState::dime() {
vendingmachine->setState(vendingmachine->getfifteenState());

return "";
}

//---------------------------------------------
std::string fiveState::quarter() {
vendingmachine->setState(vendingmachine->getstartState());

return "dispense";
}

//---------------------------------------------
std::string fiveState::toString() {
return "estado five";
}

//---------------------------------------------
tenState::tenState(VendingMachine *vendingmachine) : vendingmachine( vendingmachine ) {
this->vendingmachine = vendingmachine;
}

//---------------------------------------------
std::string tenState::nickel() {
vendingmachine->setState(vendingmachine->getfifteenState());

return "";
}

//---------------------------------------------
std::string tenState::dime() {
vendingmachine->setState(vendingmachine->gettwentyState());

return "";
}

//---------------------------------------------
std::string tenState::quarter() {
vendingmachine->setState(vendingmachine->getstartState());

return "dispense";
}

//---------------------------------------------
std::string tenState::toString() {
return "estado ten";
}

//---------------------------------------------
twentyState::twentyState(VendingMachine *vendingmachine) : vendingmachine( vendingmachine ) {
this->vendingmachine = vendingmachine;
}

//---------------------------------------------
std::string twentyState::nickel() {
vendingmachine->setState(vendingmachine->getstartState());

return "dispense";
}

//---------------------------------------------
std::string twentyState::dime() {
vendingmachine->setState(vendingmachine->getstartState());

return "dispense";
}

//---------------------------------------------
std::string twentyState::quarter() {
vendingmachine->setState(vendingmachine->getstartState());

return "dispense";
}

//---------------------------------------------
std::string twentyState::toString() {
return "estado twenty";
}


this is FSM.cpp
#include "stdafx.h"
#include "FSM.h"


//int _tmain(int argc, _TCHAR* argv[])
int main()
{
VendingMachine* vendingmachine = new VendingMachine();
std::cout << vendingmachine->getState();
return 0;
}

I am getting error 2259 cannot instantiate abstract class.

Please help, how can i overcome this to have the code working?

Thank you very much.