虚函数设计问题

时间:2014-03-06 17:30:25

标签: c++ inheritance

我有一个基类,目前我有一个名为get_value()的方法,它应该返回适​​当转换为各种基本数据类型的值。因为,我们不能只有返回类型不同的虚拟方法,我必须执行以下操作:

virtual void get_value(unsigned int index, unsigned char & r) const = 0;
virtual void get_value(unsigned int index, char & r) const = 0;
virtual void get_value(unsigned int index, unsigned short & r) const = 0;
virtual void get_value(unsigned int index, short & r) const = 0;
virtual void get_value(unsigned int index, unsigned int & r) const = 0;
virtual void get_value(unsigned int index, int & r) const = 0;
virtual void get_value(unsigned int index, float & r) const = 0;
virtual void get_value(unsigned int index, double & r) const = 0;

从维护的角度来看,这非常烦人,而且由于用户必须执行以下操作,因此用法有点尴尬:

unsigned char v;
obj->get_value(100, v);

无论如何,所有子类都必须为这些类型中的每一种重写的事实令人讨厌。我想知道是否有人有任何建议可以避免这种情况,或者以某种方式只通过一个虚拟函数以更紧凑的方式做到这一点。

儿童班可能是这样的:

void get_value(unsigned int index, unsigned char & r) const {get<unsigned char>(index, r);}
void get_value(unsigned int index, char & r) const {get<char>(index, r);}
void get_value(unsigned int index, unsigned short & r) const {get<unsigned short>(index, r);}
void get_value(unsigned int index, short & r) const {get<short>(index, r);}
void get_value(unsigned int index, unsigned int & r) const {get<unsigned int>(index,r);}
void get_value(unsigned int index, int & r) const {get<int>(index,r);}
void get_value(unsigned int index, float & r) const {get<float>(index,r);}
void get_value(unsigned int index, double & r) const {get<double>(index,r);}

这个专门的模板get方法为每个子类做了特定的事情。

3 个答案:

答案 0 :(得分:5)

您应该考虑创建不同的功能。

int getInt();
double getDouble();

等等。

您的主叫代码似乎必须知道任何情况下的差异。由于您可以执行的操作(显然至少)没有真正的抽象,因此您可以明确区分。模板和面向对象的类可能只会增加不必要的复杂性。

当然,为了判断这一点,人们可能需要更多的背景。只是我0.02€:))

答案 1 :(得分:4)

您可能想要查看templates 。它们允许您指定类型:

foo<float>(bar); // calls the float version
foo<int>(bar); // calls the int version

答案 2 :(得分:1)

您可以进行单个虚拟函数调用,返回boost::variant,如下所示:

using vartype = boost::variant<
    unsigned char,
    char,
    unsigned short,
    short,
    // ...
>;
virtual vartype get_value(unsigned int index) const = 0;