0

例如,我有一个类子类化一个向量

class A : private vector<int>
{
};

这使得vector类中的所有方法都是私有的A。我想公开vector, like中的 const 方法size();和非常量方法,如push_back()私有。如何实施?

4

3 回答 3

3

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

桥型

于 2013-08-15T04:16:03.323 回答
3

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

#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. 不必显式键入模板参数。


相关问题“如何从基类公开继承,但在派生类中将基类的一些公共方法设为私有?”公认答案?显示相同的技术。这应该是先搜索答案的提示;)但是请注意,该答案使用access-declarations,在 C++03 中已弃用,我在 C++11 中找不到它们的迹象(即不要' t 使用它们,更喜欢使用这里显示的声明)。

于 2013-08-15T05:08:54.487 回答
1

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

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

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

于 2013-08-15T04:51:48.247 回答