有什么方法可以使基类的const方法公共和非const方法私有?

时间:2013-08-15 04:10:58

标签: c++

例如,我有一个子类为vector

的类
class A : private vector<int>
{
};

这会使vector中的所有方法在课程A中保密。我想在vector中创建const方法,如size(),public;和非const方法,如push_back(),私有。如何实现呢?

3 个答案:

答案 0 :(得分:3)

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

bridge pattern

答案 1 :(得分:3)

您可以使用 using-declaration 来(重新)介绍继承函数的名称,将它们放在公共&#34;部分&#34;将使所引用的类中的所有函数重载具有可公开访问的名称:

#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();
}

注意:我使用vector vector<int>注入类名,它继承到A。没有必要显式键入模板参数。


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

答案 2 :(得分:1)

您可以只为const向量创建一个typedef:typedef const std::vector<int> A;

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

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