C++中public、protected及private用法 以及各种继承方式的影响

这篇文章主要介绍了C++中public、protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下

初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++中public、protected及private用法。相信对于大家深入掌握C++程序设计会有很大的帮助。

这里我们首先要明白下面几点。

1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:

用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。

2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以:

protected成员可以被派生类对象访问,不能被用户代码(类外)访问。


继承中的特点:

先记住:不管是否继承,上面的规则永远适用!

派生访问说明符对于派生类的成员(及友元)能否直接访问直接基类的成员没什么影响,对基类成员的访问权限只与基类中的访问说明符有关。

派生访问说明符的作用是控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限,即父类的private说明符说明了派生类不能访问,而private继承方式只是将基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private,这影响的只是派生类类外的访问权限,派生类在类内还是可以访问那些基类中的public和protected成员(虽然它们现在变成了private)。

有public, protected, private三种继承方式,它们相应地改变了派生类的用户以及派生类的派生类的访问权限。

1.public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public, protected, private

2.protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected, protected, private

3.private继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private

但无论哪种继承方式,上面两点都没有改变:

1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问;

2.protected成员可以被派生类访问。


下面是一个private继承的例子:

class A{
public:
	A() {
		a1 = 1;
		a2 = 2;
		a3 = 3;
	}

	void fun() {
		cout << a1 << endl;   //正确
		cout << a2 << endl;   //正确,类内访问
		cout << a3 << endl;   //正确,类内访问
	}
	int a1;

protected:
	int a2;
	void protected_fun() { cout << "A::protected_fun() "<< a2 <<" "<< a3 << endl; }

private:
	int a3;
	void privated_fun() { cout << "A::privated_fun() " << a2 << " " << a3 << endl; }
};

class B :private A
{
public:
	void print() {
		cout << a1 << endl;   //正确,基类public成员,在派生类中变成了private,可以被派生类类内访问
		cout << a2 << endl;   //正确,基类的protected成员,在派生类中变成了private,可以被派生类类内访问
		//cout << a3 << endl;   //错误,无法访问基类的private成员
        protected_fun(); //正确
		//privated_fun();//错误,子类无法访问基类的private权限的成员
	}
};

class C :public B
{
public:
	void print_C() {
		print(); //正确
		//protected_fun(); //错误 “A::protected_fun()”不可访问,因为“B”使用“private”从“A”继承
		//cout << a1 << endl;   //错误 “A::a1”不可访问,因为“B”使用“private”从“A”继承
		//cout << a2 << endl;   //错误,“A::a2”不可访问,因为“B”使用“private”从“A”继承
		//cout << a3 << endl;   //错误,无法访问
		
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	A a;
	a.fun();//正确  输出 1 2 3
	//a.protected_fun();//错误,类外不能访问protected成员
	//a.privated_fun();//错误,类外不能访问private成员

	a.a1 = 10; //正确
	//a.a2 = 20;//错误,类外不能访问protected成员
	//a.a3 = 30;//错误,类外不能访问pprivate成员


	B b;
	//b.fun();//错误, 类外不能访问private成员
	b.print(); //正确
	//cout << b.a1 << endl;   //错误, 类外不能访问private成员
	//cout << b.a2 << endl;   //错误,类外不能访问private成员
	//cout << b.a3 << endl;   //错误,类外不能访问private成员


	system("pause");
	return 0;
}

参考:https://blog.csdn.net/yyf0986/article/details/49335163

猜你喜欢

转载自blog.csdn.net/qq_25800311/article/details/82667940