Привет, можно ли реализовать следующее?
Есть много классов объектов, у которых есть общий предок.
У каждого класса есть свое состояние объекта (по сути набор булевых или целочесленных значений). Для каждого класса этот набор отличается, но есть и общие значения.
Я определил базовый класс состояния так:
class CAbstractState
{
public:
    enum ContactState {csUnknown=-1,csOff,csOn,csBlink};    //состояние "контакта"
    CAbstractState();
    virtual void    disable()=0;    //установка неактивного состояния
    virtual void    enable()=0;     //установка активного состояния по умолчанию
    virtual void    clear()=0;      //инициализация
    bool            changed;        //признак изменения состояния на сервере
};
Затем для базового класса объявил наследника
class CRailObjectState : public CAbstractState
{
public:
    CRailObjectState();
    ContactState    error;      //признак ошибки
    ContactState    block;      //признак блокировки
    void            disable();
    void            enable();
    void            clear();
    CRailObjectState    &operator=(const CRailObjectState & state);
    bool                operator==(const CRailObjectState & state);
    bool                operator!=(const CRailObjectState & state);
};
CRailObjectState &CRailObjectState::operator =(const CRailObjectState &state)
{
    if(this!=&state)
    {
        error = state.error;
        block = state.block;
    }
    return  *this;
}
bool CRailObjectState::operator==(const CRailObjectState &state)
{
    return (error==state.error) && (block==state.block);
}
bool CRailObjectState::operator!=(const CRailObjectState &state)
{
    return  !(*this==state);
}
и к примеру еще одни наследник для конкретного типа объекта
class CLightState : public CRailObjectState
{
public:
    CLightState();
    ContactState    manevrSignal;
    ContactState    trainSignal;
    ContactState    inviteSignal;
    ContactState    blueSignal;
    ContactState    ngState;
    ContactState    lampFail;
    void    disable();
    void    enable();
    void    clear();
    CLightState &operator=(const CLightState & state);
    bool        operator ==(const CLightState & state);
    bool        operator !=(const CLightState & state);
    void        setDeined();
    void        setAllowManevr();
    void        setAllowTrain();
    bool        isDenied();
};
CLightState &CLightState::operator =(const CLightState &state)
{
    if(this!=&state)
    {
        this->error = state.error;
        this->block = state.block;
        this->manevrSignal = state.manevrSignal;
        this->trainSignal = state.trainSignal;
        this->inviteSignal = state.inviteSignal;
        this->blueSignal = state.blueSignal;
        this->ngState = state.ngState;
        this->commandK = state.commandK;
        this->commandMk = state.commandMk;
        this->commandKm = state.commandKm;
        this->releK = state.releK;
        this->releMk = state.releMk;
        this->releKm = state.releKm;
    }
    return  *this;
}
bool CLightState::operator ==(const CLightState &state)
{
    return  (this->error == state.error) &&
            (this->block == state.block) &&
            (this->manevrSignal == state.manevrSignal) &&
            (this->trainSignal == state.trainSignal) &&
            (this->inviteSignal == state.inviteSignal) &&
            (this->blueSignal == state.blueSignal) &&
            (this->ngState == state.ngState) &&
            (this->commandK == state.commandK) &&
            (this->commandMk == state.commandMk) &&
            (this->commandKm == state.commandKm) &&
            (this->releK == state.releK) &&
            (this->releMk == state.releMk) &&
            (this->releKm == state.releKm);
}
bool CLightState::operator !=(const CLightState & state)
{
    return !(*this==state);
}
Базовый класс объектов (очень урезанный)
class CRailObject   :   public  QObject, public CXMLSerialisationObject
{
    Q_OBJECT
    CRailObjectState    *   fobjectState;   //состояние объекта
explicit    CRailObject(CEC *   ParentEC);
    ~CRailObject();
void                update(CRailObjectState *   State);
virtual     bool    calcState() = 0;                //вычислить состояние
}
Вобщем все вычисления состояния объекта производятся в виртуальной функции calcState().
В функцию update(..) для кадого класса передается соотвествующее ему состояние (как показано выше).
Можно ли сделать операторы присваивания и сравнения виртуальными? что бы сравенение наследников было корректным?
Т.е. что бы для состояний CLightState вызывался соответствующий оператор присваивания/сравнения?