• 友元类


    #include "stdafx.h"
    #include <iostream>
    
    /*一个类A声明为一个为B的友元类之后,类A就可以任意访问类B的所有
    成员(公有的、保护的和私有的)。但是,如果一个类D继承自类B,
    类B中的友元关系统并不会被继承,也就是说,类A是类B的友元但却不是
    类B的派生类D的友元。即类A不可以访问类D的保护的和私有的成员。
    在上面的代码中,被注释了的部分不能够通过编译,因为D不是A的友
    元类,B的友元关系并没有被继承。而在A的Print函数成员中,参数为
    基类B的Const引用;而实参即可以是D类的对象,从而实现了在A类中
    调用D类成员的目的。当然,你完全可以把A声明为D的友元类。对这种
    机制的解释:首先,在A的Print函数中,通过B类对象调用其私有的虚
    函数(b.Print()),由于A是B的友元,该调用是完全合法的。而在用
    D对象调用A的Print函数时,b.Print()调用动态绑定到了D类对象
    的函数版本的调用。这里,也说明了另外一个问题:类成员的访问控制
    只是在编译时有效。*/
    
    class B
    {
    	friend class A;
    private:
    	virtual void Print() const
    	{
    		std::cout<<"B"<<std::endl;
    	}
    };
    
    class D : public B
    {
    	friend class A;
    private:
    	virtual void Print()
    	{
    		std::cout<<"D"<<std::endl;
    	}
    };
    
    class A
    {
    public:
    	A()
    	{
    		B b;
    		std::cout<<"A Constructor:";
    		b.Print();
    		//	D d;
    		//	d.Print();	//error: virtual void D::Print() const is private
    	}
    
    	void Print( const 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);
    
    	return 0;
    }
    
    
  • 相关阅读:
    正则表达式学习
    加载词库小程序
    把一个固定文件夹内容编入xml中(Dom4J递归)
    lucene 中文分词器中的一个Bug
    Sax解析Xml
    用Dom4J解析即编写xml
    ”万能查重器“小程序
    登陆界面(jsp)客户端验证
    lucene 自定义分词器小程序
    用Jdom编写及解析xml文档
  • 原文地址:https://www.cnblogs.com/lilun/p/2453578.html
Copyright © 2020-2023  润新知