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

C++ C++;,函数参数的多态性与模板化,c++,function,templates,polymorphism,arguments,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;}; 模板 A类{ta;}; 模板 B类:公共A{T B;}; 下面的类表示一个修改过的容器 template <typename Item> struct TItems {typedef std::vector <Ite

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

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

template <typename T>
class B: public A <T> {T b;};
模板
A类{ta;};
模板
B类:公共A{T B;};
下面的类表示一个修改过的容器

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

template <typename Item>
class ModCont
{
    private:
            typename TItems <Item>::Type items;
};
模板
结构滴度{typedef std::vector Type;};
模板
类ModCont
{
私人:
typename TItems::类型项;
};
函数test()将指向对象容器的指针作为形式参数:

template <typename T>
void test ( ModCont <A <T> > *it) {}
模板
无效测试(ModCont*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;
}
intmain(intargc,char*argv[])
{
ModContA\u项目;
ModContB_项;
测试(&a_项);//有效
测试(&b_项);//不起作用
返回0;
}
我找到的唯一方法是以以下方式模板化test()方法的参数:

template <typename Object>
void test ( ModCont <Object> *it) {}
模板
无效测试(ModCont*it){}
有没有办法使用“函数”多态性而不是编译多态性(模板?)

谢谢你的帮助……

苹果是水果


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

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


如果您想使用运行时多态性,必须确保<>代码> MODCONT/CODE>派生自<代码> MODECOT > C++处理多态性的方式不使其成为默认值。或者,您可以让所有的

ModCont
都从一些通用的
ModContBase
派生出来,尽管还不清楚它是如何工作的。

您希望您的容器是*而不是A。您还需要一个构造函数,它接受U*的容器并将该容器的内容添加到自身。使用
static\U cast
进行此强制转换,这样您就有了类型安全性,即U是从a派生的类型。

您很困惑:(1)模板是多态性的一种形式(2)模板在编译时专门使用,而不是在运行时使用。@Marcin:谢谢您的评论…您的函数
test
,如前所述,不是一个方法,而是一个自由函数。请显示最小的可编译代码来显示问题,这样我们就不必猜测您到底做了什么。请注意:您没有以任何其他方式向我们显示运行时多态性,因此我认为模板无论如何都是可行的(还有通过引用传递)。