вызванный чисто виртуальный метод protobuf DynamicMessage отражение addMessage?

#c #reflection #protocol-buffers

Вопрос:

Я анализирую сообщение с помощью прото-файла во время выполнения. Я создал «прототипное сообщение» и попытался получить информацию об отражении каждого поля. когда дело доходит до вложенного сообщения, мне нужно AddMessage получить внутренние поля.

// протофайл

 message A {
   int32  a1 = 1;
   string a2 = 2;
};
message B {
   repeated A b1 = 1;
   int64      b2 = 2;
};
 
 Class ProtoType {
Message* msg;
BizX* biz_x;
void Init(const std::stringamp; proto_file_path) {
    // parse from file to get msgDesc
    auto* factory = new google::protobuf::DynamicMessageFactory();
    factory->SetDelegateToGeneratedFactory(true);                                                                 
    msg= mFactory->GetPrototype(msgDesc);         
}
void InitRefl() {
    biz_x = new BizX();
    biz_x->Init(*(msg->New()));
}
};
 
 class BizX {
BizY* biz_y;
Reflection* refl;
Descriptor* desc;
void Init(const Messageamp; msg) {
    refl = msg.GetReflection();
    desc = msg.GetDescriptor();

    const auto* field_desc = desc->FindFieldByName("b1");
    auto* p = msg.New();
    auto* tmp = refl->AddMessage(p, field_desc);

    biz_y = new BizY();
    biz_y->Init(msg);
} 
};
 
 class BizY {
Reflection* refl;
Descriptor* desc;
void Init(const Messageamp; msg) {
    refl = msg.GetReflection();
    desc = msg.GetDescriptor();

    const auto* field_desc = desc->FindFieldByName("b1");
    auto* p = msg.New();
    auto* tmp = refl->AddMessage(p, field_desc); // crash!!!:pure virtual method called
}
};
 
 int main() {
    ProtoType* p = new ProtoType();
    p->Init("proto-file")
    p->InitRefl();
    return 0;
}
 

Я думал BizY::Init , что должен был получить тот же результат, BizX::Init что и, но он разбился, почему?