C ++ хочет вызвать производную функцию из базового класса - PullRequest
0 голосов
/ 31 марта 2011

У меня следующая ситуация

class base
{
public:

   virtual void Accepted(SOCKET s)  //// Event
   {

   }
   void Listner()
   {
          SOCKET acpted;
          Accepted(acpted); /// When I call I want derived class's Accepted() to get called

   }

};


class derived
{
   virtual void Accepted(SOCKET s)  //// Event
   {
         ////// HERE i will write actual implementation (QUESTION)
   }

}

Я хочу вызвать функцию производного класса. Это будет работать как событие здесь. Я хочу уведомить производный класс о том, что что-то произошло в базовом классе.

Ответы [ 6 ]

6 голосов
/ 31 марта 2011

class derived : public base сделает derived фактически наследуемым от base.Тогда ваш вызов виртуальной функции будет работать так, как ожидалось.

Обратите внимание, что вы не можете делать такие вызовы виртуальных функций в конструкторе или деструкторе base - В то время, когда вызывается конструктор base, derived часть еще не существует.В то время, когда вызывается деструктор base, часть derived уже уничтожена.

РЕДАКТИРОВАТЬ: Демо, в ответ на комментарий.

class base
{
public:
    virtual void Accepted(SOCKET s)  //// Event
    {
        cout << "base::Accepted" << endl;
    }
    void Listner()
    {
        SOCKET acpted = 0;
        Accepted(acpted); /// When I call I want derived class's Accepted() to get called
    }
};


class derived : public base
{
    virtual void Accepted(SOCKET s)  //// Event
    {
        cout << "derived::Accepted" << endl;
    }
};


int main(int argc, char * argv[])
{
  derived d;
    d.Listner();
}

Это будет печатать derived::Accepted

2 голосов
/ 31 марта 2011

Это работает так, как вы хотите. Если ваш реальный код не работает, значит, вы не показали нам все необходимое. Вот почему мы умоляем вас показать нам реальный код. Как вы думаете, вы единственный здесь, кто имеет дело с большой кодовой базой, которой нельзя поделиться в Интернете? Как вы думаете, как остальные из нас получают помощь? Напишите небольшой пример, который фактически повторяет поведение, которое вы видите, и опубликуйте его. Не публикуйте псевдокод, который вы даже не скомпилировали.

Вот как вы можете делать то, что вы пытаетесь сделать, а также пример того, как вы должны публиковать сообщения.

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void Accepted()
    {
        cout << "Base::Accepted" << endl;
    }
    void Listener()
    {
        cout << "Base::Listener" << endl;
        Accepted();
    }
};

class Der : public Base
{
public:
    void Accepted()
    {
        cout << "Derived::Accepted" << endl;
    }
};

int main()
{
    cout << "*** BASE ***" << endl;
    Base b;
    b.Listener();

    cout << "\n*** DERIVED ***" << endl;
    Der d;
    d.Listener();
}

Вывод:

*** BASE ***
Base::Listener
Base::Accepted

*** DERIVED ***
Base::Listener
Derived::Accepted
0 голосов
/ 31 марта 2011

Спасибо друг за ответы. Все были технически правильны. Я решил это следующим образом

Я хотел разрешить создание объекта класса base, не превращая ни один метод в чисто виртуальный.

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

Итак, я создаю еще один абстрактный класс, в котором все необходимые методы являются чисто виртуальными, и из этого я извлекаю базу классов. таким образом это позволило мне создать объект базы.

, например

class __base__
{
public:
   virtual void Accepted(SOCKET s)  = 0 //// Event    
   {     
   }    

};

class base : public __base__
{ 
  public:     
       virtual void Accepted(SOCKET s)  //// Event    
        {     
}    
void Listner()    
{           
  SOCKET acpted;           
  Accepted(acpted); /// When I call I want derived class's Accepted() to get called     
}  
};

class derived : public base
{    
  virtual void Accepted(SOCKET s)  //// Event    
  {          
      ////// HERE i will write actual implementation (QUESTION)    
  }  
}
0 голосов
/ 31 марта 2011

Будьте осторожны, чтобы не вызывать ваши виртуальные функции во время строительства или разрушения. Может произойти плохая реализация определенных вещей:

C ++ виртуальная функция из конструктора

0 голосов
/ 31 марта 2011

Внесите следующие изменения в ваш код.1) производный класс: общедоступная база 2) Создать объект производного класса и вызвать функцию Listener.(Если вы создаете объект базового класса, он не будет работать)

Dhiraj

0 голосов
/ 31 марта 2011

Помимо создания производного класса, расширяющего базовый класс (производный: public base), вы также можете объявить свой метод Accepted чисто виртуальным в базовом классе:

virtual void Accepted(SOCKET s) = 0;

таким образом производный класс вынужден реализовать принятый метод.

А также метод Accepted в производном классе не обязательно должен быть виртуальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...