多态性和STL容器......指针是不必要的?

时间:2017-11-17 02:07:41

标签: c++ stl polymorphism

我之前在软件工程堆栈交换中遇到过这个问题和答案。问题是,"Why are pointers not recommended when coding with c++?"。评分最高的答案提供两点,第二点是感兴趣的答案。它声明:

  

C ++中指针的大多数用法都是不必要的。

他的规范有点冗长,但作者在其中指出,“......现代C ++习语通常根本不需要指针。”

首先想到的是STL容器中的多态性。如果不使用指针,C ++中的许多其他内容是如何实现的呢?

经过一些研究,this是我能够发现的(剧透:它没有帮助)。

1 个答案:

答案 0 :(得分:0)

至少在C ++ 11中,有可能是IMO,这是一个坏主意:

#include <vector>
#include <iostream>
#include <functional>

namespace
{
struct A
{
  virtual void operator()(void) { std::cout << "in A" << std::endl; }
};

struct B : public A
{
  virtual void operator()(void) { std::cout << "in B" << std::endl; }
};
}

int main(void)
{
  A a;
  B b;
  std::vector<std::reference_wrapper<A>> v;
  v.push_back(a);
  v.push_back(b);
  v[0]();
  v[1]();
  return 0;
}

我同意上述评论。当您需要在容器中执行动态多态时,请使用智能指针。他们运作良好。当它们被智能指针包裹时,指针也不错。 警告:在上面,你必须确保a和b至少与该向量一样长,否则引用变为未定义(上面的代码是坏的)。