调用继承方法

Call inherited method

本文关键字:方法 继承 调用      更新时间:2023-10-16

我有一个名为"Packet"的基类,具有以下方法:

    template <typename T>
    void write()
    {
        //DoSomething
        writeHandler<T>();
    }

和一个名为PacketA的子类,它们为每个处理程序

实现模板专门化方法。

在packketa中,我想写一个名为B()的方法,如下所示

public function B() { write<MySpezialisation>(); }

我假定它将调用Packet::write with我的专业化writeHandler

如果我有我的基类Packet::write<MySpecialisation>();}它没有调用我的模板特殊化方法。

怎么了

#ifndef CLIENTIPPACKET_H
#define CLIENTIPPACKET_H
/*INCLUDES SKIPPED*/
class PacketA : public Packet
{
public:
    struct MySpecialization
    {
    };
    PacketA() : Packet() {}
private:
    template<typename T> void writeHandler();
public:
    void write() { Packet::writeHandler<MySpezialisation>(); }
};
template<>
void PacketA::writeHandler<PacketA::MySpecialization>()
{
   //DOSOMETHING
}
#endif

您如何期望您的Packet理解writeHandler()应该来自PacketA ?writeHandler()不是虚拟的(也不能是,因为它是模板化的),所以Packet将始终使用自己的版本。

我可以建议重写为

template <typename T, typename P>
void write(T data, P& packet) 
{
    m_data.clear();
    getStream()->atStart();
    packet.writeHandler<T>(data);
    getStream()->atStart();
}

PacketA

public function B() { write<MySpezialisation>(data, *this); }

(您是否在您的代码中忘记了data ?)

但是,根据您的特定设计需求,可能存在更好的方法。