允许从特定派生类访问基类成员

时间:2017-03-27 15:17:52

标签: c++ oop inheritance member-access

在一个项目中,我有一个类层次结构实现了一个层次结构的图形(也就是说,一个图形节点可以是一个图形本身 - 把它想象成一个电子电路,其中一个门实际上可以是一个集成芯片,实例)。因此,我将一些课程Base导出到GroupLeaf,而课程Base有一个属性ancestor,我希望能够从Group的给定方法(添加子项时)设置,但不能从其他任何地方设置:

class Group;

class Base {
    private: // or protected?
        Group* ancestor;
};

class Group : public Base {
    private:
        void setAncestor(Base* child) {
            // Something like
            child->ancestor = this;
        }
};

class Leaf : public Base {
    // ...
};

实现这一目标的“正确”方法是什么?通常,我会使用friend方法,但在我看来,在这种情况下这是不可能的,因为我必须在Group::setAncestor中声明朋友Base,必须在之前声明。 (另请注意,这些声明位于实际代码中的不同文件中。)

2 个答案:

答案 0 :(得分:0)

数据成员Base :: ancestor应具有受保护的访问权限。这样它就可用于派生类。

答案 1 :(得分:0)

您可以在BaseLeaf类中以及在其他任何地方使用私有继承将其声明为受保护,因此受保护的成员将是私有的。

class Group;

class Base {
    protected:
        Group* ancestor;
};

class Group : public Base {
    private:
        void setAncestor(Base* newAncestor) {
            // Something like
            ancestor = newAncestor->ancestor;
        }
};

class Leaf : private Base {
    // ...
};

请注意,我将名称从child更改为newAncestor

因此,当您创建一个新孩子时,您可以执行以下操作:

Base ancestor;
Group child;
child->setAncestor(&ancestor)