Я использую асинхронный 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();
}
}