虚函数可以访问基类的友元吗?

Can a virtual function access the friend of base class?

本文关键字:友元 基类 访问 函数      更新时间:2023-10-16

我只是C++的初学者,我的问题是虚函数可以访问基类的朋友吗? 还是虚函数只会访问定义它的类的友元函数?

class A
{
friend class B;
public:
virtual void setData();
};

现在,如果一个类是从类 A 派生的

class C:public class A{
public:
setData()
{
  //can I use the friend class B here?
}
};

首先,你们的友谊倒退了。 BA的朋友,但这给了AB的额外权利

在C++,友谊不会通勤。 AB是朋友,但A可能不是B的朋友。

第二,友谊不是遗传的。 你不会和你母亲的朋友出去喝酒。

第三,有很多方法可以重新发布或共享权利。 作为友元的类可以具有对友元执行操作的方法。

假设你真的想要这个:

class B {
  friend class A;
  void doStuff();
};
class A {
public:
  virtual void setData(B* b) = 0;
};
class C:public A{
public:
  virtual void setData(B* b) {
    b->do_stuff();
  }
};

C::setData生成错误。 但是我们可以这样改变它:

class A {
protected:
  void do_stuff_on_b(B* b) { b->do_stuff(); }
public:
  virtual void setData(B* b) = 0;
};
class C:public A{
public:
  virtual void setData(B* b) {
    do_stuff_on_b(b);
  }
};

我们也可以概括这一点并创建一个访问令牌:

class B {
  struct access_token{ explicit access_token(int) {} };
  friend class A;
public:
  void doStuff(access_token);
};
class A {
protected:
  static B::access_token access_b() { return access_token(0); };
public:
  virtual void setData(B* b) = 0;
};
class C:public A{
public:
  virtual void setData(B* b) {
    b->do_stuff( access_b() );
  }
};

我们根据拥有可以传递的访问令牌来访问B私有方法。 这些方法是公开的,但令牌本身只能由朋友创建。