【问题标题】:Is there a pure virtual function in the C++ Standard Library?C++ 标准库中有纯虚函数吗?
【发布时间】:2016-05-03 17:47:00
【问题描述】:

Nicola Gigante's lecture in 2015 中,他提到(在开头)标准库中没有纯虚函数(或者他不知道)。我相信 Alex Stepanov 反对这种语言特性,但是自从最初的 STL 设计以来,有没有任何纯虚函数潜入标准库?

FWIW(如果我错了,请纠正我)唯一指针中的删除器最终在大多数实现中使用虚拟调度,但这些不是纯虚拟。

【问题讨论】:

  • 您是指整个标准库还是只是STL(迭代器、算法和容器)部分?
  • 我不知道标准库中有任何纯虚函数。 unique_ptr 的默认删除器是非常非虚拟的,因此如果您转换为非多态基类,则不安全。另一方面,shared_ptr 使用原始指针保留一个类型擦除的删除器函数,因此这样是安全的。
  • 我没有听过讲座,但它似乎是关于泛型编程和STL。我怀疑重点是,在STL 中实现的C++ 通用编程面向对象编程 中可能被认为的典型方法完全正交.
  • STL != 标准库
  • @LorahAttkins:不,不是。仅举几个既不是源自 C 也不是 STL 一部分的部分:整个 std::stringstd::complex、异常。现在std::stringstd::complex 通常对于使用虚函数来说时间紧迫,也没有必要——简单的值根本不需要多态性。但是 和异常确实使用虚函数。

标签: c++ language-lawyer virtual-functions c++-standard-library pure-virtual


【解决方案1】:

[syserr.errcat.overview] 拥有std::error_category

class error_category {
  virtual const char* name() const noexcept = 0;
  virtual string message(int ev) const = 0;
};

C++14 中没有其他的。

【讨论】:

  • 你怎么确定没有其他人?只是好奇。 (附:+1)
  • @Nemo 从第 17 章开始,在标准文本中搜索= 0。目测每一次命中(没有那么多)。拖延做实际工作的好理由。
  • 请注意,std::function 的典型实现将使用纯虚函数作为实现细节(或者,使用 C 风格的 OO 重现等效项)。未来和其他运行时概念/类型擦除类型可能也是如此。
  • 我想这里的一个问题是,这些函数是纯虚拟的会违反标准吗? (如果是这种情况,是否有任何程序无法正常运行?)
  • @Mehrdad 我看不出它如何导致符合标准的程序停止工作。但是,它将允许接受不符合要求的程序 - 具有从 std::error_category 派生的类的程序,该类无法覆盖其中一种方法。这本身可以被认为是在实现方面不符合要求 - 一个无效程序被接受而没有诊断的事实。
【解决方案2】:

C++17 将[mem.res.class] 中的std::pmr::memory_resource 添加到the one in C++14,具有以下private 纯虚函数:

class memory_resource {
    virtual void* do_allocate(size_t bytes, size_t alignment) = 0;
    virtual void do_deallocate(void* p, size_t bytes, size_t alignment) = 0;
    virtual bool do_is_equal(const memory_resource& other) const noexcept = 0;
};

是的,private virtual functions can be overridden

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 2018-08-05
    • 2019-12-07
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2020-08-21
    • 2015-08-07
    相关资源
    最近更新 更多