• 派生类的访问控制-“三看”原则-派生类类成员访问级别设置的原则


    一、单个类的访问控制

    1、类成员访问级别(public、private、protected)

    public:修饰的数据成员、成员函数在类的内部,类的外都都能使用。

    protected:修饰的数据成员、成员函数在类的内部使用,在继承的子类中可用。

    private:修饰的数据成员、成员函数只能在类的内部使用,不能在类的外部使用。


    二、不同的继承方式会改变继承成员的访问属性

    1)C++中的继承方式会影响子类的对外访问属性

    public继承:父类成员在子类中保持原有访问级别

    private继承:父类成员在子类中变为private成员

    protected继承:父类中public成员会变成protected

                                  父类中protected成员仍然为protected

                                  父类中private成员仍然为private

    2)private成员在子类中依然存在,但是却无法访问到。不论种方式继承基类,派生类都不能直接使用基类的私有成员。

    3)C++中子类对外访问属性表

    父类成员访问级别

    public

    proteced

    private

    public

    public

    proteced

    private

    proteced

    proteced

    proteced

    private

    private

    private

    private

    Private


    三、“三看”原则

    对外访问属性表比较复杂,这里总结出一个“三看”原则:

    C++中的继承方式(public、private、protected)会影响子类的对外访问属性     

    判断某一句话,能否被访问

             1)看调用语句,这句话写在子类的内部、外部

             2)看子类如何从父类继承(public、private、protected)     

             3)看父类中的访问级别(public、private、protected)

    demo

    //类的继承方式对子类对外访问属性影响
    
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    class A
    {
    private:
    	int a;
    protected:
    	int b;
    public:
    	int c;
    
    	A()
    	{
    		a = 0;		b = 0;		c = 0;
    	}
    
    	void set(int a, int b, int c)
    	{
    		this->a = a;		this->b = b;		this->c = c;
    	}
    };
    class B : public A
    {
    public:
    	void print()
    	{
    		//cout<<"a = "<<a; //err
    		cout<<"b = "<<b; //ok
    		cout<<"c = "<<endl; //ok
    	}
    };
    
    class C : protected A
    {
    public:
    	void print()
    	{
    		//cout<<"a = "<<a; //err
    		cout<<"b = "<<b; // ok
    		cout<<"c = "<<endl; //ok
    	}
    };
    
    class D : private A
    {
    public:
    	void print()
    	{
    		//cout<<"a = "<<a; //err
    		cout<<"b = "<<b<<endl;  //ok
    		cout<<"c = "<<c<<endl; // ok
    	}
    };
    
    int main()
    {
    	
    	A aa;
    	B bb;
    	C cc;
    	D dd;
    
    	aa.c = 100;  //ok
    	bb.c = 100; // ok
    	//cc.c = 100; // err 保护的
    	//dd.c = 100;  // err
    	
    	aa.set(1, 2, 3); //ok
    	bb.set(10, 20, 30); //ok
    	//cc.set(40, 50, 60); // err
    	//dd.set(70, 80, 90);  //err
    	
    
    	bb.print(); //ok
    	cc.print(); //ok
    	dd.print(); //
    
    	return 0;
    }
    


    四、派生类类成员访问级别设置的原则

    如何恰当的使用public,protected和private为成员声明访问级别?

    1、需要被外界访问的成员直接设置为public

    2、只能在当前类中访问的成员设置为private

    3、只能在当前类和子类中访问的成员设置为protected,protected成员的访问权限介于public和private之间。


  • 相关阅读:
    无法加载模块 TP3.2
    always_populate_raw_post_data
    关于(void**)及其相关的理解
    面向对象设计原则
    数据对齐总结
    C++ POD类型
    do..while(false)的用法总结
    c++为什么定义了析构函数的类的operator new[]传入的参数会多4字节?
    C++ new new[]详解
    【转】C内存操作函数
  • 原文地址:https://www.cnblogs.com/zhangyaoqi/p/4591572.html
Copyright © 2020-2023  润新知