static_cast перенаправляет на несколько классов, имеющих одну и ту же функцию, даже если он приведен к одному классу? Почему это работает? - PullRequest
0 голосов
/ 21 апреля 2020

Я использую асинхронный C ++ GRP C, в котором я получаю указатель void* на объект, в этом случае он может соответствовать экземплярам классов MapCall или ReduceCall. Каждый из этих классов имеет функцию void Continue(). Когда я получаю объект, я static_cast указывает на объект MapCall. Хотя приведение правильно приводит к правильному классу и вызывает правильный метод Continue, хотя я явно приводил к определенному классу. Также не выдается никакой ошибки.

Я предоставил объявления классов и функций и код, вызывающий его.

class Worker {

    public:

        Worker(std::string ip_addr_port);

        void HandleRpcs();

    class MapData
        {
         public:
            MapData(MasterWorker::AsyncService* service, ServerCompletionQueue* compl_cq, Worker* parent)
            :service_(service), compl_cq_(compl_cq), map_status_(SLEEP), responder_(&ctx_), parent_service_(parent) {

                is_done = false;
                Continue();
            } 
           virtual void Continue(){ ...
           }
}
    class ReduceData
        {
         public:
            ReduceData(MasterWorker::AsyncService* service, ServerCompletionQueue* compl_cq, Worker* parent)
            :service_(service), compl_cq_(compl_cq), map_status_(SLEEP), responder_(&ctx_), parent_service_(parent) {



            virtual void Continue(){ ...
            }
      }
}

И HandleRpcs() кастинг и вызов его

void Worker::HandleRpcs() {

    mr_flag_=1;

    new MapData(&service_, call_cq_.get(), this);
    new ReduceData(&service_, call_cq_.get(), this);

    while(1){
      void* call_tag;  
      bool call_ok;

      call_cq_->Next(&call_tag, &call_ok );
      GPR_ASSERT(call_ok);

      // if (mr_flag_)
      static_cast<MapData*>(call_tag)->Continue();  
      // else
        // static_cast<ReduceData*>(call_tag)->Continue();  

    }

  }
...