zoukankan      html  css  js  c++  java
  • protected、public、private

    一、protected成员

    1. 受保护的成员的可访问性

    • 对于一个类的protected成员,①该类的用户(如类对象)不能访问它,②该类的派生类的成员(及其友元)可以访问它。
    • 派生类的成员及其友元不能访问其基类对象的受保护成员,它们只能访问继承到派生类对象中的受保护成员
    • 派生类的成员及其友元只能访问派生类对象中的基类部分的protected成员,不能访问普通的基类对象中的protected成员

    借助下面的例子加深理解:

    class Base {
    protected:
    	int proc = 0;
    };
    
    class Derv : public Base {
    	void set_base_false()
    	{ 
    		Base b;
    		b.proc = 1; 		//[Error] 'int Base::proc' is protected
    	}
    	void set_base_true()
    	{
    		Derv d;
    		d.proc = 1;
    	}
    	void set_base_true2()
    	{
    		proc = 1;			//访问该派生类继承而来的proc成员 
    	}
    };

     

    二、三种继承方式

    1. 派生访问说明符

    对于派生类的成员及友元能否访问其直接基类的成员没什么影响

    目的:控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限

    2. 继承方式不影响派生类的成员及其友元访问基类的成员

    class Base {
    public:
    	void pub_mem();
    protected:
    	int prot_mem;
    private:
    	int priv_mem;
    };
    
    //公有继承 
    class Pub_derv : public Base {
    	int f1() { pub_mem(); }
    	int f2() { return prot_mem; }
    	int f3() { return priv_mem; }		//错误:派生类不可访问private成员
    };
    
    //私有继承 
    class Priv_derv : private Base {
    	int f1() { pub_mem(); }
    	int f2() { return prot_mem; }
    	int f3() { return priv_mem; }		//错误:派生类不可访问private成员
    };
    

    3. 继承方式影响派生类对象及其派生类访问基类的成员

    公有继承:派生类中(从基类中)继承而来的成员都遵循其原有的访问说明符

    私有继承:派生类中(从基类中)继承而来的成员的访问说明符都是private

    保护继承:派生类中(从基类中)继承而来的成员,若其在基类中的访问说明符是public,则在派生类中的访问说明符变为protected

    	Pub_derv d1;		//公有继承而来的派生类对象d1 
    	Priv_derv d2;		//私有继承而来的派生类对象d2 
    	d1.pub_mem(); 		//正确:pub_mem()在派生类中是public的 
    	cout << d1.prot_mem << endl; 	//错误:prot_mem在派生类中是protected的,但类的对象无法访问protected成员
    	d2.pub_mem(); 		//错误:pub_mem()在派生类中是private的 
    

    补充:其实题目中所说的基类的成员是指继承到派生类中的基类的成员(即,派生类的成员的基类部分

     

    三、派生类向基类转换的可访问性

    0. 影响因素

    使用该转换的代码

    派生类的派生访问说明符

    1. D继承自B

    • D公有地继承B时,用户代码才能使用派生类向基类的转换(用户代码可访问B的公有成员)
    • 如果B是D的直接基类,则D的成员和友元可以使用派生类向基类的转换(D的成员和友元可访问B的公有成员)
    • D不是私有地继承B时,则D的派生类的成员和友元可以使用D向B的类型转换(D的派生类的成员和友元可访问B的公有成员)

    小结:对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的。

     

  • 相关阅读:
    函数参数的讨论
    redirect-windows-cmd-stdout-and-stderr-to-a-single-file
    rust 多文件工程
    rust: 默认初始化,函数重载
    VSCode如何格式化所有文件
    FLV协议5分钟入门浅析
    WebRTC:数据传输相关协议简介
    WebSocket协议:5分钟从入门到精通
    Nodejs进阶:crypto模块中你需要掌握的安全基础知识
    前端进阶之路:如何高质量完成产品需求开发
  • 原文地址:https://www.cnblogs.com/xzxl/p/7779194.html
Copyright © 2011-2022 走看看