C ++子类访问

时间:2011-09-10 15:33:16

标签: c++ inheritance subclass

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

有没有办法允许各个子类改变彼此继承的主类变量,但不允许公共访问主类?如果不使用friend关键字,这将产生复杂的代码。

完整背景:

我有一个节点类,可以相对于它添加/删除节点。有一个依赖于节点类的列表类(和子类),这意味着节点不能公开访问,以防它也破坏类列表。还必须可以访问节点以列出帮助程序类。

为确保发生这种情况,我在另一个类accessnode中实现了受保护的节点。所有希望节点权限的类都将accessnode继承为protected(因此accessnode类不公开)。这意味着帮助程序和列表类/子类都可以访问节点。

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

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

简而言之:

(受保护)AccessNode中的节点 TemplateList:受保护的AccessNode CharList:受保护的AccessNode TemplateList需要访问CharList的AccessNode AccessNode / Node不能公开。

3 个答案:

答案 0 :(得分:2)

免责声明:这与这个特定问题完全无关,但更多的是关于引导您解决此问题以及今天其他问题的一般问题。

我认为你在这里咆哮着错误的树。我感觉你提供了对列表内部节点的访问,然后期望节点类型本身保护列表不受粗心的修改(即可能破坏列表不变量的那些)。在这样做的过程中,您正在寻找一个更简单问题的复杂解决方案:不要让用户首先访问节点。

如果你看一下STL提供的关于容器和特定列表的方法,事情会变得简单得多。该列表是根据一些未知的无法访问的节点实现的。这些节点的操作上的访问说明符根本不重要,因为用户无法访问对象本身,因此它们可以是公共的。用户可以通过不同的代理(iteratorconst_iterator类型)访问列表内容,该代理仅提供那些不会破坏列表状态的操作。

答案 1 :(得分:1)

你总是可以在顶级课程中添加protected访问者函数,但不要这样做,重新考虑设计可能要好得多。

编辑:具体示例:

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.
}

干杯&第h。,

答案 2 :(得分:1)

我不完全确定我理解你所说的“子类[改变]彼此继承的主类变量”。

如果要允许仅通过派生类访问基类成员变量,请创建成员变量protected。和/或添加protected访问者函数。

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

如果你澄清了这个问题会有所帮助。