虚函数可以访问基类的友元吗?
Can a virtual function access the friend of base class?
我只是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?
}
};
首先,你们的友谊倒退了。 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
私有方法。 这些方法是公开的,但令牌本身只能由朋友创建。
相关文章:
- 模板类无法识别友元运算符
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 继承和友元函数,从基类访问受保护的成员
- 将子类方法声明为基类的友元
- 基类中受保护的纯虚函数如何被基类的友元类使用?
- 友元类对象是否可以在其成员函数中访问派生类对象的基类私有成员?
- 在派生类或基类中,我应该在哪里声明友元类
- 虚函数可以访问基类的友元吗?
- 访问友元类模板基子句中的私有定义
- 在派生类中重新定义基类的友元函数
- 指向友元函数中基类参数类型的指针
- 在基/派生类的成员函数/友元函数中派生* 到 Base* 的转换
- 基类和派生类的友元函数
- Visual Studio 2010 中的友元模板类和 Lambda 函数
- 私有基类通过子类中的模板友元函数和模板方法影响成员访问
- 传递指针到声明为友元的类成员的pthread
- 使用模板参数友元从类继承
- 基类的友元类如何通过派生自基类的类的对象访问该基类的成员
- 友元函数类内定义只允许在非本地类定义中使用.什么意思