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
中声明friendGroup::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-courseSetAncenter()
在我的示例中有不同的签名。只是一个建议。但我不确定你指的是不是这个。是的,就是这个。要点是让祖先
指向另一个实例。不是此
。