我试图创建一个非模板基类来创建一个接口,通过它我可以与派生模板类进行交互。我的希望是使用部分虚拟函数重载,但有些不起作用,我不知道为什么。 任何人都可以解释为什么我下面的代码返回:如何在C++模板子类中部分重载虚函数?
B match = False
D match = True
E match = False
,而不是B,d返回true,和E返回false?我本以为在派生类中的重载操作符会拿起指针到int'&我'并被调用,但它不。
为了清楚起见,我没有试图覆盖基本版本的匹配,我正在尝试对它进行过载,特别是希望它有一个不同的接口,在这种情况下,接口要比专用接口更多在Base中,它在使用其功能签名时接管。
我也试图避免为每个可能实例化的派生模板扩展基类。
即使是陌生人,我也可能会在这里疯狂,但我发誓这在不久前的某个时间对我有用! Fwiw我在OSX 10.5上,使用llvm 7.0.0和clang 700.1.76。这可能是一个编译器特质?
虽然我试图(不成功)在这里使用部分重载,但我真的很开放,可以解决按照其参数类型选择模板实例函数的问题,而不会增加类,如果-thens /或者向基类添加特定的特化。如果您有另一种方法可以用于类似功能,我很乐意听到它。
谢谢您提供的任何见解!
#include <stdio.h>
class Base
{
public:
Base() {}
virtual ~Base(){}
virtual bool match(const void *data) const { return false; }
};
template <class Type>
class Derived: public Base
{
public:
Derived():Base() {}
~Derived() override{}
virtual bool match(const Type *data) const { return true; }
};
int main(int argc, char **argv)
{
Derived<int> *d = new Derived<int>();
Derived<float> *e = new Derived<float>();
Base *b = d;
int i;
printf("B match = %s\n",b->match(&i)?"True":"False");
printf("D match = %s\n",d->match(&i)?"True":"False");
printf("E match = %s\n",e->match(&i)?"True":"False");
}
πάνταῥεῖ,好点!我忘了我可以编辑这个问题! :)修正。 – Dave
你的虚拟功能并不纯粹。看看这是否给你一个合理的解决方案:http://stackoverflow.com/questions/2919584/override-number-of-parameters-of-pure-virtual-functions –
@ o_weisman,感谢您的评论。使我的基本功能成为纯粹的虚拟似乎并不能解决这个设计问题。您提到的问题是值得深思的,但我无法弄清楚如何在没有为每个可能使用的派生类型增加特定的子类的情况下应用它。换句话说,如果没有内置到模板定义中的实例选择机制,则必须编写大量特定的类并进行实例化。尽管如此,谢谢你,我感谢你的帮助。 – Dave