c++ - 多态性和 STL 容器……不需要指针吗?

标签 c++ stl polymorphism

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

Most uses of pointers in C++ are unnecessary.

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

首先想到的是 STL 容器中的多态性。在不使用指针的情况下,这在 C++ 中如何实现?


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

最佳答案

至少在 C++11 中是可能的,但在我看来,这是个坏主意:

#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 至少与该 vector 一样长,否则引用将变为未定义(上面的代码是错误的)。

关于c++ - 多态性和 STL 容器……不需要指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47342220/

相关文章:

c++ - 如何使数组的大小取决于构造函数参数?

c++ - 返回转换容器的 std::transform-like 函数

java - FasterXML Jackson 的 JSON 多态性与 JsonSubTypes 和 JsonTypeInfo

c++ - 欧氏距离使用内在指令

c++ - QTableView 根据值更改行颜色

c++ - 如何打印属于 map 的一系列元素 (std::pair<size_t, std::string>)(不是所有元素)

c++ - std::istream_iterator,内存消耗

c++ - vector 重新分配后迭代器如何更新

javascript - 在 Javascript 中实现多态性——这看起来怎么样?

c++ - 基类构造函数不会调用派生类版本的虚方法