我有一个父班级和一个孩子班级。 Parent有一个名为 setId(int id)的受保护函数。现在我想让孩子的朋友类(可以称之为朋友)使得setId功能可以访问。这是可能的还是我必须重新实现Child类中的setId函数并使用parent的受保护的setId函数?
我已经尝试使用VS-Compiler,但它确实有效。
我使用gcc并得到"错误:'void Parent :: setId(int)'受到保护"
班级家长
class Parent
{
public:
Parent(){}
protected:
void setId(int id){m_id=i}
int m_id;
};
Class Child
#include "Parent.h"
class Child
: public Parent
{
friend class FriendClass;
public:
Child(){}
};
班级朋友
#include "Child.h"
class FriendClass
{
public:
FriendClass(){
Child c;
c.setId(1);
}
};
答案 0 :(得分:1)
普遍的看法认为正确的方法是升级Child中的访问权限:
class Child: public Parent {
public:
void setId(int id) override { Parent::setId(id); } // public for Friend
};
通常的理由是,这是简短的,并且在没有发布任何其他内部信息的情况下,清楚准确地表达了什么是公开的。