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

Any way to make a base class's const methods public and non-const methods private?

本文关键字:方法 const 基类 什么 可以使      更新时间:2023-10-16

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

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

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


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

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

桥接模式

您只需创建一个常量向量的typedef:typedef const std::vector<int> A;

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

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