如何允许子类具有公共基类,但在其方法中接受不同类型的参数

时间:2014-03-04 09:16:46

标签: c++ oop polymorphism

我希望这个标题最适合我的问题,但我会进一步解释。

我有两种我正在使用的数据类型(由Eigen库支持的Matrix和一对由保存int值的字符串键控的STL映射)。

我想允许我的代码尽可能一致地使用它们。所以我开始创建一个抽象基类,包括我需要的基本操作(插入,获取“行”等)并尝试派生两个子类来包装我的数据类型(一个用于矩阵,一个用于我的对)实现内部函数因为我需要。

这种方法运行了一段时间,但后来我遇到了一些打字问题,因为我的矩阵用整数索引,哈希映射用字符串索引(它们都以不同的方式表示相同的数据类型)。 当我试图编写检索“行”的代码时,我被卡住了,因为我知道我不能在我的基类中声明一个方法,然后用不同的参数类型覆盖它(矩阵通过数字索引和地图检索一行)通过字符串检索它。

如果没有过度使用每个子类的模板,是否有一种常见的方法呢?

代码示例可能会明确(原谅任何错误,因为这只是一个例子):

class BaseClass {
public:
 virtual GenericRowType getRow(???? index)=0;
}

class MatrixWrapper : public BaseClass{
 // Should be: GenericRowType getRow(int index);
}

class MapsWrapper : public BaseClass{
 // Should be: GenericRowType getRow(string index);
}

2 个答案:

答案 0 :(得分:2)

您可以使用模板:

template <typename T>
class BaseClass {
public:
 virtual GenericRowType getRow(T index)=0;
}

class MatrixWrapper : public BaseClass<int>{
 // Should be: GenericRowType getRow(int index);
}

class MapsWrapper : public BaseClass<string>{
 // Should be: GenericRowType getRow(string index);
}

答案 1 :(得分:1)

这是使用模板的经典案例。您应该使用一个类模板参数创建BaseClass模板,然后继承的类将继承到模板特化:

template <class T>
class BaseClass {
  public:
    virtual GenericRowType getRow(T index) = 0;
};

class MatrixWrapper : public BaseClass<int> {
  public:
    GenericRowType getRow(int index);
};

class MapsWrapper : public BaseClass<std::string> {
  public:
    GenericRowType getRow(std::string index);
};