【问题标题】:Any way to make a base class's const methods public and non-const methods private?有什么方法可以使基类的 const 方法公开和非 const 方法私有?
【发布时间】:2013-08-15 04:10:58
【问题描述】:

例如,我有一个类继承一个向量

class A : private vector<int>
{
};

这将使vector 中的所有方法在A 类中成为私有方法。我想让vector 中的 const 方法,比如size(),公开;和非 const 方法,例如 push_back(),私有。如何实现?

【问题讨论】:

  • 从标准库容器继承不是一个好主意;改用合成。
  • @Beta 请注意,OP 使用的是 private 继承,它更类似于组合,并不意味着可替代性。
  • 一个非常简单的解决方案是像vector&lt;int&gt; const&amp; as_vector() const { return *this; } 这样的内部转换。用户可以const_cast constness 离开,但这会违反(隐式)合同。 (同样,C 风格的转换可以通过忽略可访问性将您的 A 类型转换为 vector&lt;int&gt;。)

标签: c++


【解决方案1】:

您可以使用 using-declaration 来(重新)引入继承函数的名称,将它们放在公共“部分”中将使所引用类中具有该名称的所有函数重载均可公开访问:

#include <vector>
#include <iostream>

class A : private std::vector<int>
{
public:
    using vector::size;

    A(vector p)
        : vector(std::move(p))
    {}
};

int main()
{
    A a({1,2,3,4});
    std::cout << a.size();
}

注意:我使用的是vectorvector&lt;int&gt;injected-class-name,它继承到 A。不必显式键入模板参数。


相关问题"How to publicly inherit from a base class but make some of public methods from the base class private in the derived class?"accepted answer 显示了相同的技术。这应该是先搜索答案的提示;)但是请注意,该答案使用 access-declarations,它在 C++03 中已被弃用,我在 C 中找不到它们的迹象++11(即不要使用它们,更喜欢 using-declaration 如此处所示)。

【讨论】:

    【解决方案2】:

    不使用直接继承,而是使用桥接模式进行封装。

    bridge pattern

    【讨论】:

    • -1:您只提供一个链接。此外,您似乎将桥接模式与适配器模式混淆了。
    • 适配器用于交换类型。这在这里没有帮助。
    • 哎呀,你是对的。但是,我建议您应该稍微扩展您的答案仍然存在。
    • 我只能牵马下水。我不能让他喝酒。 :P
    【解决方案3】:

    您可以只为 const 向量创建一个 typedef:typedef const std::vector&lt;int&gt; A;

    这允许用户声明像A val; 这样的对象,并将禁用对非常量方法的访问。 (调用它们会导致编译时错误)

    缺点是它们不是不同的类型,因此您可以将A 类型的对象传递给期望const std::vector&lt;int&gt; 的函数。如果您需要两种不同的类型,那么您必须使用委托手动包装每个方法(C++ 应该已经具有强大的 typedef :-( )

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2022-10-23
      • 2012-01-09
      相关资源
      最近更新 更多