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

一、单个类的访问控制

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之间。


原文地址:https://www.cnblogs.com/zhangyaoqi/p/4591572.html