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