вопрос по ООП

 

Здравствуйте!

В приведенном коде 

class CPAway;

class CPositionAgent
{
public:
   string meName;
   CPAway *meCPAway;
   CPositionAgent::CPositionAgent()
   {
      meName = "CPositionAgent";
      meCPAway = new CPAway(&this);
   }
   
   int CPositionAgent::getStep()
   {
      return 1;
   }
};

class CPositionVirtualAgent : public CPositionAgent
{
public:
   
   CPositionVirtualAgent::CPositionVirtualAgent()
   {
      meName = "CPositionVirtualAgent";
      meCPAway = new CPAway(&this);
   }
   int CPositionVirtualAgent::getStep()
   {
      return -1;
   }

};

class CPAway
{
public:
   CPositionAgent *mePA;
   string meName;
   CPAway::CPAway(CPositionAgent *inPA)
   {
      meName = "CPAway";
      mePA = inPA;
   }
   void CPAway::setPAWay()
   {
    int lStep;
    lStep = mePA.getStep();
    Print(lStep);
   }

};

void OnStart()
  {
   CPositionVirtualAgent *lCPVA;
    
   lCPVA = new CPositionVirtualAgent();
   lCPVA.meCPAway.setPAWay();
   
   delete lCPVA;
  }

строка lCPVA.meCPAway.setPAWay() приводит к выполнению метода int CPositionAgent::getStep()

Цель же, вызвать метод int CPositionVirtualAgent::getStep()

Вопрос, что я не учитываю? Ведь экземпляр класса CPAway содержит объект CPositionVirtualAgent, почему же вызывается метод его родителя?

 
class CPAway
{
public:
   CPositionAgent *mePA;
 
Dmitry Fedoseev:
class CPAway
{
public:
   CPositionAgent *mePA;

поменять в этом месте на CPositionVirtualAgent было бы слишком просто ) 

Иногда нужно будет отсылать в CPAway и родителя

Разве разрешение не должно происходить автоматически?

 
Nikolai Karetnikov:

поменять в этом месте на CPositionVirtualAgent было бы слишком просто ) 

Иногда нужно будет отсылать в CPAway и родителя

Разве разрешение не должно происходить автоматически?

Да. Не совсем вкурил. 

А вы в курсе, что два конструктора вызывается - CPositionVirtualAgent() и CPositionAgent()? 

И еще остается два не удаленных объекта.

 
Dmitry Fedoseev:

Да. Не совсем вкурил. 

А вы в курсе, что два конструктора вызывается - CPositionVirtualAgent() и CPositionAgent()? 

И еще остается два не удаленных объекта.

в курсе, да ) Реплицировалось на скорую руку из бОльшего кода

Пока я виртуализировал метод в родителе, сделал два потомка и самолет полетел

Но ведь должно ж разрешение срабатывать, нет?


class CPAway;

class CPositionAgent
{
public:
    string meName;
   CPAway *meCPAway;  
   virtual int getStep() {return NULL;};
};

class CPositionAgentReal : public CPositionAgent
{
public:

   CPositionAgentReal::CPositionAgentReal()
   {
      meName = "CPositionAgent";
      meCPAway = new CPAway(&this);
   }
   
   int getStep()
   {
      return 1;
   }
};

class CPositionVirtualAgent : public CPositionAgent
{
public:
   
   CPositionVirtualAgent::CPositionVirtualAgent()
   {
      meName = "CPositionVirtualAgent";
      meCPAway = new CPAway(&this);
   }
   int getStep()
   {
      return -1;
   }

};

class CPAway
{
public:
   CPositionAgent *mePA;
   string meName;
   CPAway::CPAway(CPositionAgent *inPA)
   {
      meName = "CPAway";
      mePA = inPA;
   }
   void CPAway::setPAWay()
   {
    int lStep;
    lStep = mePA.getStep();
    Print(lStep);
   }

};

void OnStart()
  {
   CPositionVirtualAgent *lCPVA;
    
   lCPVA = new CPositionVirtualAgent();
   lCPVA.meCPAway.setPAWay();
   
   delete lCPVA;
  }
 

Просто добавьте virtual куда надо и все.

class CPositionAgent
{
public:
   string meName;
   CPAway *meCPAway;
   CPositionAgent::CPositionAgent()
   {
      meName = "CPositionAgent";
      meCPAway = new CPAway(&this);
   }
   
   virtual int CPositionAgent::getStep()
   {
      return 1;
   }
};
 
Dmitry Fedoseev:

Просто добавьте virtual куда надо и все.

Спасибо!

Причина обращения: