我只是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?
}
};
答案 0 :(得分:0)
首先,你有友谊倒退。 B
是A
的朋友,但在A
上提供B
零额外权利。
在C ++中,友谊不会通勤。 A
说B
是朋友,但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
私有方法的访问。这些方法是公开的,但令牌本身只能由朋友创建。