C ++,多态与函数参数的模板化

时间:2012-01-14 10:03:00

标签: c++ function templates polymorphism arguments

有两个类A和B,其中A是基类,B是派生类:

template <typename T>
class A {T a;};

template <typename T>
class B: public A <T> {T b;};

以及代表修改后的容器的以下类

template <typename Item>
struct TItems {typedef std::vector <Item> Type;};

template <typename Item>
class ModCont
{
    private:
            typename TItems <Item>::Type items;
};

函数test()具有指向A对象容器的指针作为形式参数:

template <typename T>
void test ( ModCont <A <T> > *it) {}

我想应用多态并将B的容器传递给方法测试:

int main(int argc, char* argv[])
{

  ModCont < A <double> > a_items;
  ModCont < B <double> > b_items;
  test (&a_items); //Works
  test (&b_items); //Does not work
  return 0;
}

我发现的唯一方法是以这种方式模板化test()方法的参数:

template <typename Object>
void test ( ModCont <Object> *it) {}

有没有办法如何使用“函数”多态而不是编译多态(模板?)

感谢您的帮助......

3 个答案:

答案 0 :(得分:3)

苹果是一种水果。

一袋苹果不是一袋水果。那是因为你可以把梨放在一袋水果里。

答案 1 :(得分:3)

嗯,首先,模板不是运行时多态 - 它们是编译时多态性。

如果要对此使用运行时多态,则必须确保ModCont<B<T> >派生自ModCont<A<T> > - C ++处理多态的方式不会使其成为默认值。或者,您可以让所有ModCont<T>派生自某些一般ModContBase,但目前还不清楚这是如何运作的。

答案 2 :(得分:0)

你希望你的容器是A *而不是A.你还想要一个构造函数,它接受一个U *的容器并将该容器的内容添加到它自己。使用static_cast进行此转换,以便您具有类型安全性,即U是从A派生的类型。