有两个类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) {}
有没有办法如何使用“函数”多态而不是编译多态(模板?)
感谢您的帮助......
答案 0 :(得分:3)
苹果是一种水果。
一袋苹果不是一袋水果。那是因为你可以把梨放在一袋水果里。答案 1 :(得分:3)
嗯,首先,模板不是运行时多态 - 它们是编译时多态性。
如果要对此使用运行时多态,则必须确保ModCont<B<T> >
派生自ModCont<A<T> >
- C ++处理多态的方式不会使其成为默认值。或者,您可以让所有ModCont<T>
派生自某些一般ModContBase
,但目前还不清楚这是如何运作的。
答案 2 :(得分:0)
你希望你的容器是A *而不是A.你还想要一个构造函数,它接受一个U *的容器并将该容器的内容添加到它自己。使用static_cast
进行此转换,以便您具有类型安全性,即U是从A派生的类型。