C++,多态性与函数参数的模板化
C++, polymorphism vs. templatization of a function argument
有两个类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) {}
有什么方法可以使用"函数"多态性而不是编译多态性(模板)吗
谢谢你的帮助。。。
Uhm,首先,模板是而不是运行时多态性——它们是编译时多态性。
如果要将运行时多态性用于此,则必须确保ModCont<B<T> >
派生自ModCont<A<T> >
——C++处理多态性的方式不会使其成为默认值。或者,您可以让所有的ModCont<T>
都派生自一些通用的ModContBase
,尽管还不清楚它是如何工作的。
苹果就是水果。
一袋苹果不是一袋水果。那是因为你可以把一个梨放在一袋水果里。
您希望您的容器是A*而不是A。您还希望有一个构造函数,它接受一个U*容器,并将该容器的内容添加到自身中。对该强制转换使用static_cast
,以便具有类型安全性,即U是从a.派生的类型
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类