c++子类访问

C++ subclass access

本文关键字:访问 子类 c++      更新时间:2023-10-16

我有一个由许多子类继承的主类。继承的主类必须至少在继承中受到保护,以防止非派生类通过子类使用或修改它。

是否有一种方法允许不同的子类修改彼此继承的主类变量,但不允许对主类的公共访问?如果不使用friend关键字,这将产生复杂的代码。

在完整上下文中:

我有一个节点类,添加/删除相对于它的节点。有一个依赖于节点类的列表类(和子类),这意味着如果节点也破坏了类列表,它就不能被公开访问。Node还必须能够被列表助手类访问。

为了确保发生这种情况,我在另一个类accessnode中实现了protected下的node。所有需要节点权限的类都将accessnode继承为受保护的(因此accessnode类不是公共的)。这意味着helper和list类/子类都可以访问node。

问题是,为了让TemplateList通过只读方式复制CharList (TemplateList的子类),它需要访问CharList的节点(以避免使用CharList的迭代器)-问题是,节点是受保护的(以防止外部的,非accessnode的干扰),实现一个授予访问节点的公共方法会破坏这一点。

我需要的是横向继承,这样accessnode类型的所有子类都可以访问彼此的节点,而无需公开授予访问权。

简而言之:

(Protected) AccessNode内的节点。
TemplateList: Protected AccessNode.
CharList: Protected AccessNode.
TemplateList需要访问CharList的AccessNode。
AccessNode/Node不能是public

免责声明:这与这个特定的问题无关,但更多的是关于导致你今天的这个问题和其他问题的一般问题。

我想你找错人了。我的感觉是,您提供了对列表内部节点的访问,然后期望节点类型本身保护列表免受粗心的修改(即那些可能破坏列表不变量的修改)。这样做,您正在为一个简单得多的问题寻求一个复杂的解决方案:首先不要让用户访问节点。 如果您看一下STL提供的关于容器,特别是列表的方法,事情就会变得简单得多。该列表是根据一些未知的不可访问节点来实现的。这些节点操作上的访问说明符根本不重要,因为用户不能访问对象本身,所以它们可以是公共的。用户通过不同的代理(iterator, const_iterator类型)访问列表的内容,该代理只提供那些不能扰乱列表状态的操作。

我不太明白你所说的"子类改变彼此继承的主类变量"是什么意思。

如果只允许派生类访问基类成员变量,则将成员变量设置为protected。和/或添加protected访问器功能

如果您希望派生类的不同实例修改基类中保存的共享数据,则可以在基类中添加static protected成员变量。所有实例将共享相同的成员变量。

如果你能把问题说清楚就好了。

您总是可以在顶级类中添加protected访问器函数,但与其这样做,不如重新考虑设计。

EDIT:具体示例:

class Base
{
protected:
    struct State
    {
        int     m1;
        char    m2;
        State(): m1(), m2() {}
    };
    State   state_;
    static State& state( Base& o) { return o.state_; }
};
class Derived
    : public Base
{
public:
    void foo( Base& other )
    {
        Base::State&    baseState   = state( other );
        // Blah blah.
    }
};
int main()
{
    Derived o;
    // Blah blah.
}

干杯,hth。