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

C++, polymorphism vs. templatization of a function argument

本文关键字:参数 函数 多态性 C++      更新时间:2023-10-16

有两个类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.派生的类型