Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ - Fatal编程技术网

C++ 有没有办法强制派生类继承友元类?

C++ 有没有办法强制派生类继承友元类?,c++,C++,我正在编写一个自用的反射实用程序,我为所有要反射的类都提供了一个基类: class Reflectable { public: friend class ReflectionModifier; virtual ~Reflectable() = default; }; 这里有一个测试类: class A : public Reflectable { private: int i; }; 反射修改器: class ReflectionModifier { public: R

我正在编写一个自用的反射实用程序,我为所有要反射的类都提供了一个基类:

class Reflectable {
 public:
  friend class ReflectionModifier;
  virtual ~Reflectable() = default;
};
这里有一个测试类:

class A : public Reflectable {
 private:
  int i;
};
反射修改器

class ReflectionModifier {
 public:
  ReflectionModifier(Reflectable *reflectable) {
    if (auto *a = dynamic_cast<A *>(reflectable)) {
      a->i = 1;
    }
  }
};
但它也有问题:首先,它很难看,支架不匹配。第二,如果有人想要多类继承,它将不起作用

p.p.S. 如果您想知道
ReflectionModifier
如何知道class
A
ReflectionModifier
是由扫描类的程序生成的。这就是为什么我说手动添加friend ship很“烦人”,因为整个反射系统基本上是由程序自动完成的,一个类编写除了继承
Reflectable

p.p.p.S这是一个全新的项目,我可以使用C++17甚至C++20

否。通过语言设计,基类的朋友可以成为派生类的朋友的唯一方法是派生类也显式声明他们为朋友。换句话说,派生类不会自动将
friend
状态授予任何基类的朋友。基类可以提供
受保护的
成员函数,为基类的朋友提供接口。派生类然后可以使用这些继承的成员函数(受
保护
,派生类和朋友可以访问这些函数,但其他代码不能访问这些函数),基类的朋友可以成为派生类的朋友的唯一方法是,派生类也显式地将它们声明为朋友。换句话说,派生类不会自动将
friend
状态授予任何基类的朋友。基类可以提供
受保护的
成员函数,为基类的朋友提供接口。派生类然后可以使用这些继承的成员函数(受
保护
,派生类和朋友可以访问它们,但其他代码不能访问)
#define ReflectableClass(name) class name : public Reflectable { friend class ReflectionModifier;

ReflectableClass(A)
 private:
  int i;
};