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

时间:2017-10-24 14:32:49

标签: c++

我只是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?
}
};

1 个答案:

答案 0 :(得分:0)

首先,你有友谊倒退。 BA的朋友,但在A上提供B 零额外权利

在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私有方法的访问。这些方法是公开的,但令牌本身只能由朋友创建。