我有一点继承/模板问题。我试图创建一个由IBinding
和TcpClient
实现的接口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
还有其他方法吗?是不是有办法用模板做到这一点?
答案 0 :(得分:4)
没有。模板函数本质上与虚拟调度不兼容。你无法覆盖它们。它们可以隐藏名称,但这可能对你没有帮助。因此,您需要为将要使用的每种流类型提供虚函数,或者为可在IBinding级别使用的流类型创建抽象。