【发布时间】:2014-02-21 10:45:14
【问题描述】:
我有一个接口(缺少很多成员,但请注意这个接口是强制性的)。我将需要 5 个继承自它的类,它们将具有 _value 属性。所以,ins\ 实现了 5 个类(对于 char、short、int、float、double),我想到了一个模板类:
class my_interface
{
public:
virtual [various_types] getValue() const = 0;
};
template<typename T>
class my_class : public my_interface
{
private:
T _value;
public:
my_class(T value) : _value(value) {} // initialize the attribute on construct
virtual T getValue() const { return _value; }
};
...这样类似的东西可以工作:
void my_function()
{
my_inteface* a = new my_class<char>(42);
my_interace* b = new my_class<short>(21);
int result;
result = a->getValue() + b->getValue();
}
但我不知道我该怎么做。看来您不能在纯虚拟界面上制作模板。对我来说,唯一可行的方法是让 getValue() 始终返回双精度值,因为它是我需要的最大尺寸类型。但是,我不喜欢这种解决方案。
【问题讨论】:
-
您需要对您的类型进行所有算术运算还是受到限制?你总是有不知道子类的实际类型的问题。
-
你的问题是你根本不能有像
[various_types]这样的虚函数的返回类型,除非你把my_interface也做成一个模板类。 -
这是不可能的,因为 C++ 是一种静态类型语言,返回类型不能从动态类型派生。您可能想查看 Boost.Variant 和/或 Boost.Any 以了解类似问题的实现。然而,没有人能说它是否是你需要的,因为你没有告诉我们这背后的原始问题:告诉我们你想要实现的什么,而不是如何你尝试解决它。
-
@MatthiasBonora:对不起,我需要一个接口,而不是抽象类,事实上,你明白,我说的是算术运算符重载。所以是的,我需要所有的算术运算。
标签: c++ interface polymorphism