有什么方法可以使基类的 const 方法公开和非 const 方法私有?
Any way to make a base class's const methods public and non-const methods private?
例如,我有一个类将向量子类化
class A : private vector<int>
{
};
这使得vector
中的所有方法在类A
中都是私有的。我想公开vector
中的const方法,比如size()
;和非常量方法,如push_back()
,private。如何实施?
您可以使用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
。没有必要显式键入模板参数。
相关问题"如何从基类公开继承,但在派生类中使基类的一些公共方法私有?"的公认答案显示了相同的技术。这应该是一个先搜索答案的提示;)然而,请注意,该答案使用访问声明,这在C++03中已被弃用,我在C++11中找不到它们的迹象(即,不要使用它们,更喜欢使用声明
不要使用直接继承,而是使用桥接模式进行封装。
桥接模式
您只需创建一个常量向量的typedef:typedef const std::vector<int> A;
这允许用户声明像A val;
这样的对象,并将禁用对非常量方法的访问。(调用它们将导致编译时错误)
缺点是它们不是不同的类型,所以可以将A
类型的对象传递给期望const std::vector<int>
的函数。如果您需要两个独立的类型,那么您必须用委托手动包装每个方法(C++应该已经有了强typedefs:-()
相关文章:
- 如何在声明为 const 的方法中更改类成员
- 具有参数 (const T *&) 或 (T * &) 或 (const T * const &) 或 (T * const &) 的方法
- 从 const 对象访问非 const 方法
- 为什么我可以调用一个从const方法更改成员的方法
- 使用新的c++返回值语法的Const方法
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 初始化 const 成员的正确方法
- const 方法使用引用修改对象
- 从类方法返回 "const char*" 作为 std::string&
- 从"wcslen"替换到"strnlen_s"时,用"const char*"进行类型转换是正确的方法吗?
- 将const指针(EVP_MD)保存到变量中,以将其重新使用为类方法(HMAC)
- 为什么 constexpr 假设我的方法就是 const
- 正确的方法通过巨大的const对象的向量
- 使用静态方法初始化 const 类字段的做法是好是坏
- 为什么重写方法并将 const 添加到参数类型有效
- CPP主方法const声明
- 如何基于模板参数制作方法const
- 命名重载的getter方法:const和nonconst
- 声明Get方法const时出错