c ++在一个类中使用模板和虚方法

时间:2016-04-08 18:43:24

标签: c++ templates inheritance

我有一点继承/模板问题。我试图创建一个由IBindingTcpClient实现的接口TcpServer(将有2-3种不同的TcpServers,它们仅在Stream的类型上有所不同(它们在接受连接请求后生成的套接字抽象。

这是一个简化的例子:

接口:

struct IBinding
    {
        virtual ~IBinding() {}

        virtual void bind(const std::string endpoint) = 0;

        virtual void terminate() = 0;
    };

    typedef std::shared_ptr<IBinding> TBindingPtr;

部首:

#include "IBinding.h"

class TcpServer : public IBinding
{
public:
    TcpServer();
    ~TcpServer();

    virtual void bind(const std::string endpoint);

    virtual void terminate();

};

实现:

#include "TcpServer.h"
#include "StreamTypeA.h"
#include "StreamTypeB.h"

TcpServer::TcpServer()  {   }

TcpServer::~TcpServer() {   }

void TcpServer::terminate() {         }

void TcpServer::bind(const std::string endpointStr)
{
        auto stream = std::make_shared<StreamTypeA>();  // Here I need to use different types depending on the server implementation

}   

现在,我想创建一个TcpServer的两个实例并在其上调用.bind(),但是他们应该创建不同类型的Streams。

a)据我所知,在c ++中将类型作为参数传递给bind()方法是不可能的

b)尝试定义模板化的bind方法也不起作用,因为它是虚拟的

    template<class TSocket>
    virtual void bind(const std::string endpoint);

c)我可能只是创建了TcpServer

的两种不同实现

还有其他方法吗?是不是有办法用模板做到这一点?

1 个答案:

答案 0 :(得分:4)

没有。模板函数本质上与虚拟调度不兼容。你无法覆盖它们。它们可以隐藏名称,但这可能对你没有帮助。因此,您需要为将要使用的每种流类型提供虚函数,或者为可在IBinding级别使用的流类型创建抽象。