例如,我有一个子类为vector
的类class A : private vector<int>
{
};
这会使vector
中的所有方法在课程A
中保密。我想在vector
中创建const方法,如size()
,public;和非const方法,如push_back()
,私有。如何实现呢?
答案 0 :(得分:3)
使用桥接模式封装,而不是使用直接继承。
答案 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 :-()