Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 允许从特定派生类访问基类成员_C++_Oop_Inheritance_Member Access - Fatal编程技术网

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

C++ 允许从特定派生类访问基类成员,c++,oop,inheritance,member-access,C++,Oop,Inheritance,Member Access,在一个项目中,我有一个类层次结构来实现一个具有层次结构层次的图(也就是说,一个图节点可以是一个图本身——比如把它想象成一个电子电路,其中一个门实际上可以是一个集成芯片)。因此,我有一些类Base派生到Group和Leaf,类Base有一个属性祖先,我希望能够从Group的给定方法(添加子级时)设置该属性,但不能从其他任何地方设置: class Group; class Base { private: // or protected? Group* ancestor; }

在一个项目中,我有一个类层次结构来实现一个具有层次结构层次的图(也就是说,一个图节点可以是一个图本身——比如把它想象成一个电子电路,其中一个门实际上可以是一个集成芯片)。因此,我有一些类
Base
派生到
Group
Leaf
,类
Base
有一个属性
祖先
,我希望能够从
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
方法,但在我看来,在这种情况下这是不可能的,因为我必须在
Base
中声明friend
Group::setconsensort
,这必须在之前声明。(还请注意,这些声明在实际代码中位于不同的文件中。)

data member Base::祖先应该具有受保护的访问权限。通过这种方式,它将对派生类可用。

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

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
更改为
new祖先

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

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

除非
祖先
是公共的,否则这不起作用<代码>组可以访问其自身基类的受保护成员。它不能通过
Base
指针访问受保护的成员,因为这些可能是一些不相关类的基,如
Leaf
。您可以使整个类成为朋友,即
朋友类组
。您可以使用转发声明和
friend
。它不会有相同的效果。@O'Neil Off-course
SetAncenter()
在我的示例中有不同的签名。只是一个建议。但我不确定你指的是不是这个。是的,就是这个。要点是让
祖先
指向另一个实例。不是