调用继承的方法

时间:2015-07-27 10:08:18

标签: c++ templates

我有一个基类叫做#34; Packet"使用以下方法:

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

和一个名为PacketA的子类,为每个处理程序实现模板spezialisation方法

在PacketA中,我想写一个名为B()的方法,如下面的

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

我认为它会调用Packet :: write 我的spezialisation writeHandler

如果我有我的基础班 Packet::write<MySpecialisation>();} 它没有调用我的模板spezialisation方法。

有什么问题?

#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

1 个答案:

答案 0 :(得分:0)

您如何理解Packet writeHandler()应该来自PacketAwriteHandler()不是虚拟的(并且不能,因为它是模板化的),因此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?)

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