今天学习了一下友元类,在百度文库上看到了一篇文章,理解了一下,现在自己总结一下。
①A是B的友元类,所以A中能够访问B中的私有成员。
②D继承于B,但是友元并不继承,所以在A中不能访问D的私有成员。
但是对于②,只在进行静态编译的时候,A不能访问D的私有成员;如果A中调用的方式,是在运行时链接的,则可以实现在A中访问D的私有成员。
#include "stdafx.h"
#include <iostream>
using namespace std;
class B
{
friend class A;
private:
virtual void Print()
{
std::cout << "B" << std::endl;
}
};
class D:public B
{
private:
virtual void Print()
{
std::cout << "D" << std::endl;
}
};
class A
{
public:
A()
{
B b;
std::cout << "A Constructor:";
b.Print();
//D d;//此处,由于A不是D的友元类,因此,静态编译的时候,是报错的。
//d.Print();
}
void Print(B &b)
{
std::cout << "A-->";
b.Print();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B b;
D d;
a.Print(b);
a.Print(d);//此处虽然A不是D的友元类,但是,由于D继承B,并且将B的Print函数进行了重载,因此此处只有在运行时,才会进行连接(及我们称的<运行时连接,动态连接>),这里我们可以看到,程序能够正常运行,结果也是对的。
return 0;
}
输出结果为:
A Constructor:B
A-->B
A-->D
由此,我们得出结论:友元类的访问限制,只在静态编译时有效,在动态链接时,是不受限制的。