[英]C++: How to define a virtual function with generic return type?
我正在尝试在C ++中定义一个基类,该类具有由子类实现的纯虚方法。
我想为基类中的基本类型定义setter和getter函数,但我希望派生类能够确定getter和setter的基本类型。 例如,我的基类看起来像这样:
class Value
{
public:
Value();
template <class T>;
virtual T getValue() = 0;
virtual void setValue(T val) = 0;
}
我的孩子课看起来像这样:
class IntValue : public Value
{
public:
IntValue();
template <class T>
T getValue() {return _val};
void setValue(T val) {_val = val};
private:
int _val;
}
当然上面的代码不起作用。 关于如何实现这一点的任何想法? 提前致谢。
如果我正确理解您的问题,请将代码重写为
template <class T>
class Value
{
public:
Value();
virtual T getValue() = 0;
virtual void setValue(T val) = 0;
};
class IntValue : public Value<int>
{
public:
IntValue();
int getValue() {return _val;}
void setValue(int val) {_val = val;}
private:
int _val;
};
应该管用
你要求的是不可能的。 为了在vtbl
生成正确的条目(或者编译器可能使用的任何类似结构),编译器需要具体知道基类中将需要哪些条目。 您不能只在派生类中返回不同的类型,并期望基类以这种方式“知道”它; 因为这需要修改基类中的函数模板的定义。
您可以在J_D的答案中看到如何使用类模板 (而不是函数模板 )对基类进行这种修改的示例 ,但这仍然与您的问题描述完全不符,因为您不会能够创建一个Value
并以多态方式对待它。
C ++模板本质上是“fancy-pants find and replace”的类型 - 当编译器实例化函数模板时,它会生成一个替换了类型名的普通函数。 请注意,这与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
关键字都没有意义。
扩展@Billy ONeal关于类模板的说法,这可能适用于您的目的:
template<typename Type>
class Value
{
public:
virtual Type getValue() = 0;
};
class IntValue : public Value<int>
{
public:
IntValue(int value)
: m_value(value)
{
}
int getValue()
{
return m_value;
}
private:
int m_value;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.