传送门: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(); //正确,基类的protected成员,在派生类中变成了private,可以被派生类类内访问
//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;//错误,类外不能访问private成员
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