例如,我有一个类子类化一个向量
class A : private vector<int>
{
};
这使得vector
类中的所有方法都是私有的A
。我想公开vector
, like中的 const 方法size()
;和非常量方法,如push_back()
私有。如何实施?
例如,我有一个类子类化一个向量
class A : private vector<int>
{
};
这使得vector
类中的所有方法都是私有的A
。我想公开vector
, like中的 const 方法size()
;和非常量方法,如push_back()
私有。如何实施?
不使用直接继承,而是使用桥接模式进行封装。
您可以使用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 使用它们,更喜欢使用这里显示的声明)。
您可以只为 const 向量创建一个 typedef:typedef const std::vector<int> A;
这允许用户声明对象,A val;
并且将禁用对非常量方法的访问。(调用它们会导致编译时错误)
缺点是它们不是不同的类型,因此您可以将类型的对象传递A
给期望的函数const std::vector<int>
。如果您需要两种不同的类型,那么您必须使用委托手动包装每个方法(C++ 应该已经有强大的 typedef :-( )