你所要求的是不可能的。为了在vtbl
(或编译器可能使用的任何类似结构)中生成正确的条目,编译器需要知道在基类中具体需要哪些条目。您不能只在派生类中返回不同的类型,并期望基类以这种方式“了解”它;因为这需要修改基类中函数模板的定义。
在J_D 的答案中可以看到如何使用类模板(而不是函数模板)对基类进行这种修改的示例,但这仍然与您的问题描述不完全匹配,因为您不会能够创建一个并多态地对待它。Value
C++ 模板本质上是“花哨的查找和替换”类型——当编译器实例化函数模板时,它会生成一个替换类型名的普通函数。请注意,这与 C# 或 Java“泛型”非常不同,它们完全不同,依赖运行时支持和间接层来实现类似的效果。(请注意,虽然这个“查找和替换”尊重优先规则等,不像 C 预处理器宏 :))
如果你真的也想一想,这种模式是没有意义的。在客户端这会是什么样子?
class Value
{
public:
Value();
//Imagine if this were possible...
template <class T>;
virtual T getValue() = 0;
virtual void setValue(T val) = 0;
}
class IntValue : public Value
{
public:
IntValue();
int getValue() {return _val};
void setValue(int val) {_val = val};
private:
int _val;
}
class FloatValue : public Value
{
public:
FloatValue();
float getValue() {return _val};
void setValue(float val) {_val = val};
private:
float _val;
}
现在,你去使用这个类:
void example(Value * ptr)
{
//What could you possibly say the type of "bar" is? There's no type that works!
???? bar = ptr->getValue();
delete ptr;
}
int main()
{
example(new IntValue());
example(new FloatValue());
}
因此,即使允许这样做,也没有多大意义。你总是不得不一直沮丧,这意味着virtual
关键字无论如何都是没有意义的。