【问题标题】:vector_base inheritance vs compositionvector_base 继承与组合
【发布时间】:2019-09-10 08:26:26
【问题描述】:

小问题:

C++ STL 实现使用vector_base 结构/类(处理资源和分配器)作为std::vector基类,而不是使用组合,有什么原因吗?强>?

加长版:

在提高我对 C++ 知识的“追求”中,我一直在尝试重新实现 Vector 类,主要是符合 std:: 的。我想我已经很好地理解了为什么使用分配器是明智的,以及为什么您实际上希望所有内存处理都在一个单独的类/结构(RAII 和所有这些)中,但我不明白我们为什么要std::vector从该类继承而不是将其作为私有成员。 例如,LLVMgcc 都使用继承。 另一方面,我发现构造函数和赋值运算符(尤其是move-types)使用组合更容易处理。

我只是暴露了我对语言的肤浅知识吗?

作为一个例子,我搜索了一些教科书,发现 Stroustroup 的书与他 2013 年的书“C++ 编程语言,第 4编。”使用作文和他的 2014 年“编程:原理与实践,第 2 版”。使用继承!

谁能帮我解释一下?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    libc++ 使用 private 继承,而 libstdc++ 使用 protected 继承。

    受保护的私有继承主要是@​​987654321@。

    【讨论】:

    • 所以本质上是“偏好”的问题?我知道每个向量只有一个 vector_base 和私有继承之类的力量是有意义的……也许我只是对移动构造函数有问题!
    • @FooBant 是的,我会说这是一个偏好问题。
    • @FooBant 在这种情况下可能不会,但一般来说,如果基是 empty(没有非静态成员变量),那么 空基地优化。 (从 C++20 开始,[[no_unique_address]] 属性即使使用合成也可能具有相同的效果。)
    • @DanielLangr 在这种情况下是对的。主类(向量)不添加自己的数据成员,因此它是私有继承实现的零厚度包装器。
    • @n.m.同意。我只是想展示一个可能的原因(不是在这种情况下,而是在空基的情况下)更喜欢继承而不是组合。只是为了完整性。
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 2014-01-17
    • 2015-03-07
    • 1970-01-01
    • 2012-06-17
    • 2016-01-05
    • 2014-08-08
    相关资源
    最近更新 更多