C++ C++;,函数参数的多态性与模板化
有两个类A和B,其中A是基类,B是派生类: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
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
,如前所述,不是一个方法,而是一个自由函数。请显示最小的可编译代码来显示问题,这样我们就不必猜测您到底做了什么。请注意:您没有以任何其他方式向我们显示运行时多态性,因此我认为模板无论如何都是可行的(还有通过引用传递)。