Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从基调用派生方法_C++_Inheritance_Virtual Functions - Fatal编程技术网

C++ 如何从基调用派生方法

C++ 如何从基调用派生方法,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,这个问题可能是重复的,但我不明白答案如何适用于我的申请。我有一个基类和多个派生类。类方法都应该具有相同的名称。应用程序接收需要根据数据报类型进行不同解码的UDP消息。例如,如何使BaseDatagram中的Decode调用Decode in DerivedDatagramA或DerivedDatagramB class DerivedDatagramA: public BaseDatagram { ... }; class DerivedDatagramB: public BaseDat

这个问题可能是重复的,但我不明白答案如何适用于我的申请。我有一个基类和多个派生类。类方法都应该具有相同的名称。应用程序接收需要根据数据报类型进行不同解码的UDP消息。例如,如何使BaseDatagram中的Decode调用Decode in DerivedDatagramA或DerivedDatagramB

class DerivedDatagramA: public BaseDatagram
{
   ...
};

class DerivedDatagramB: public BaseDatagram
{
   ...
};

void BaseDatagram::Decode(uint8_t * buffer)
{
    switch(buffer[DATAGRAM_TYPE])
    {
        case DATAGRAM_TYPE_A:
            Decode(buffer); // How to call decode in DerivedDatagramA?
            break;
        case DATAGRAM_TYPE_B:
            Decode(buffer); // How to call decode in DerivedDatagramB?
            break;

BaseDatagram::Decode(uint8_t*)
声明为虚拟,对
Decode()
的调用将根据对象类型自动发送到
DerivedDatagramA::Decode(uint8_t*)
DerivedDatagramB::Decode(uint8_t*)

您不希望在这里继承(并且希望以不同的方式继承)。使“BaseDatagram”成为数据报的调度程序(BaseDatagram不再是数据报)。虽然这在一般情况下是有意义的,但从发布的代码中看不出有任何派生类型的对象被创建过。是的。派生对象被创建了。我知道如何声明虚拟方法,但仍然不清楚如何调用正确的对象。签名没有区别。
缓冲区[数据报类型]
指示数据报应如何解码。我可以使用不同的名称,但基类中还有其他常见功能(crc、ack id)。使用@DieterLücking评论中提到的方法是否存在任何问题?@jacknad
是。如果调用
Decode
指针已经是正确的派生类型,并且如果将
Decode
设置为虚拟,则会创建派生对象,对它的任何调用都会自动路由到派生类中的实现。
BaseDatagram::Decode
中的整个
开关
变得不必要,您可以仅为
/*oops:unknown datagram type*/
保留该函数。另外,我认为@DieterLücking的方法没有问题,假设我们都以同样的方式阅读。