Множественное наследование

 

Раз уж пошла такая пьянка.... Хочется услышать официальное мнение по поводу.

Ну и если не планируется, универсальный способ замены оного.

 
TheXpert:

Раз уж пошла такая пьянка.... Хочется услышать официальное мнение по поводу.

Ну и если не планируется, универсальный способ замены оного.

 

Множественное наследование не планируется. Прежде всего из-за безопасного кастинга. Проверки при кастинге многократно усложнятся, а отключать проверки мы не можем из соображений взломобезопасности.

Универсальный способ замены - включение объектов разных типов 

 
class Ancestor1
{
public: 
   void Method1 {}
}; 

class Ancestor2
{
public: 
   void Method2 {}
}; 

class Descendent
{
private
   Ancestor1 a1;
   Ancestor2 a2;
public: 
   void Method1 {a1.Method1;}
   void Method2 {a2.Method2;}
};
TheXpert
:

То есть? Можете объяснить на примере?

 

Вот пример. Как модифицировать и что вместо вопросиков?

class Handler1
{
public:
   virtual void Action1();
};

class Some1
{
public:
   Some1(Handler1* handler)
      : m_Handler(handler)
   {
   }
   
private:
   Handler1* m_Handler;
};

class Handler2
{
public:
   virtual void Action2();
};

class Some2
{
public:
   Some2(Handler2* handler)
      : m_Handler(handler)
   {
   }
   
private:
   Handler2* m_Handler;
};

class Handler
{
public:
   void Action1() {}
   void Action2() {}
   
   Handler()
      : m_Some1(??????)
      , m_Some2(??????)
   {}

private:
   Some1 m_Some1;
   Some2 m_Some2;
};
 

Странная архитектура, но сделать можно так

class Handler1
{
public:
   virtual void Action1() { }
};

class Some1
{
public:
   Some1(Handler1* handler)
      : m_Handler(handler)
   {
    m_Handler.Action1();
   }
   
private:
   Handler1* m_Handler;
};

class Handler2
{
public:
   virtual void Action2() { }
};

class Some2
{
public:
   Some2(Handler2* handler)
      : m_Handler(handler)
   {
    m_Handler.Action2();
   }
   
private:
   Handler2* m_Handler;
};

class Handler;

class HandlerGlue1 : public Handler1
  {
   Handler        *m_h;
public:
   HandlerGlue1(Handler *h):m_h(h) { }
   virtual void Action1() { m_h.Action1(); }
  };
  
class HandlerGlue2 : public Handler2
  {
   Handler        *m_h;
public:
   HandlerGlue2(Handler *h):m_h(h) { }
   virtual void Action2() { m_h.Action2(); }
  };

class Handler
{
public:
   void Action1() { Print(__FUNCTION__); } 
   void Action2() { Print(__FUNCTION__); }
   
   Handler()
      : m_h1(GetPointer(this))
      , m_h2(GetPointer(this))
      , m_Some1(GetPointer(m_h1))
      , m_Some2(GetPointer(m_h2))
   {}

private:
   HandlerGlue1   m_h1;
   HandlerGlue2   m_h2;
   Some1          m_Some1;
   Some2          m_Some2;
};

void OnStart()
  {
   Handler h;
  }

 
mql5:

сделать можно так

Канает :) спасибо.
Причина обращения: