【友元类】友元类的访问限制,只在静态编译时有效,在动态链接时,是不受限制的

来源:互联网 发布:软件招聘网 编辑:程序博客网 时间:2024/06/05 11:59
 

今天学习了一下友元类,在百度文库上看到了一篇文章,理解了一下,现在自己总结一下。

 

①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

 

由此,我们得出结论:友元类的访问限制,只在静态编译时有效,在动态链接时,是不受限制的。