学习c++有一段时间了,越来越感觉c及c++基础的重要性,以前一直对c++的private,public,protected及继承有一些疑惑,看过了前辈们的讲解,顿时茅塞顿开,可能有些书上讲解的很详细,但是不一定能让大家理解的清晰透彻,所以我想写一篇自己的理解,希望可以帮助一些新学习c++语言的朋友们。
c++语言的几个特性是抽象,封装,继承,多态。这里我们主要研究一下封装和继承。
1.在无继承的情况下,类内部可以随意访问,即使是private,;类外部无法访问protected/private成员
.但是可以访问public成员。
#include<iostream>#include<assert.h>usingnamespacestd;
classA{public: inta; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } voidfun(){ cout << a << endl; //正确 cout << a1 << endl; //正确 cout << a2 << endl; //正确,类内访问 cout << a3 << endl; //正确,类内访问 }public: inta1;protected: inta2;private: inta3;}; int
main(){ A itema; itema.a = 10; //正确 itema.a1 = 20; //正确 itema.a2 = 30; //错误,类外不能访问protected成员 itema.a3 = 40; //错误,类外不能访问private成员 system("pause"); return0;}通过这个例子,大家可以看到本类中的成员函数是可以访问私有成员的,但在类外,本例子就是main()中,是不能访问私有和保护成员的。
2. (先确定类继承方式,
再确定继承后子类的新成员属性,
最后确定子类内部/外部的访问权限:!!!此时即使是在子类的内部也不能访问父类的private
)
1.若是public继承的话,父类的public/protected/private属性继承到子类时,均不会变化 新成员
在子类内部访问时,无法访问父类的private(对比:在无继承时,类内可随便访问)
在子类外部访问时,无法访问子类的新成员protected/private
#include<iostream>#include<assert.h>usingnamespacestd;
classA{public: inta; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } voidfun(){ cout << a << endl; //正确 cout << a1 << endl; //正确 cout << a2 << endl; //正确 cout << a3 << endl; //正确 }public: inta1;protected: inta2;private: inta3;}; classB :public
A{ public: inta; B(inti){ A(); a = i; } voidfun(){ cout << a << endl; //正确,public成员 cout << a1 << endl; //正确,基类的public成员,在派生类中仍是public成员。 cout << a2 << endl; //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。 cout << a3 << endl; //错误,基类的private成员不能被派生类访问。 }}; int
main(){ B b(10); cout << b.a << endl; cout << b.a1 << endl; //正确 cout << b.a2 << endl; //错误,类外不能访问protected成员 cout << b.a3 << endl; //错误,类外不能访问private成员 system("pause"); return0;}2.若是protected继承的话,父类的public/protected/private属性继承到子类时,会变化为新成员(protected/protected/private)
在子类内部访问时,无法访问父类的private(对比:在无继承时,类内可随便访问)
在子类外部访问时,无法访问子类的新成员protected/private
#include<iostream>#include<assert.h>usingnamespacestd;
classA{public: inta; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } voidfun(){ cout << a << endl; //正确 cout << a1 << endl; //正确 cout << a2 << endl; //正确 cout << a3 << endl; //正确 }public: inta1;protected: inta2;private: inta3;}; classB :protectedA{
public: inta; B(inti){ A(); a = i; } voidfun(){ cout << a << endl; //正确,public成员。 cout << a1 << endl; //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。 cout << a2 << endl; //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。 cout << a3 << endl; //错误,基类的private成员不能被派生类访问。 }}; int
main(){ B b(10); cout << b.a << endl; //正确。public成员 cout << b.a1 << endl; //错误,protected成员不能在类外访问。 cout << b.a2 << endl; //错误,protected成员不能在类外访问。 cout << b.a3 << endl; //错误,private成员不能在类外访问。 system("pause"); return0;}
3.若是private继承的话,父类的public/protected/private属性继承到子类时,会变化为private/private/private;
在子类内部访问时,无法访问父类的private(对比:在无继承时,类内可随便访问)
在子类外部访问时,无法访问子类的新成员protected/private
#include<iostream>#include<assert.h>usingnamespacestd;
classA{public: inta; A(){ a1 = 1; a2 = 2; a3 = 3; a = 4; } voidfun(){ cout << a << endl; //正确 cout << a1 << endl; //正确 cout << a2 << endl; //正确 cout << a3 << endl; //正确 }public: inta1;protected: inta2;private: inta3;}; classB :private
A{ public: inta; B(inti){ A(); a = i; } voidfun(){ cout << a << endl; //正确,public成员。 cout << a1 << endl; //正确,基类public成员,在派生类中变成了private,可以被派生类访问。 cout << a2 << endl; //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。 cout << a3 << endl; //错误,基类的private成员不能被派生类访问。 }}; int
main(){ B b(10); cout << b.a << endl; //正确。public成员 cout << b.a1 << endl; //错误,private成员不能在类外访问。 cout << b.a2 << endl; //错误, private成员不能在类外访问。 cout << b.a3 << endl; //错误,private成员不能在类外访问。 system("pause"); return0;}相信大家看了上面的例子会有更深的理解,大家可以自己动手编写一下上面的例子,会有意想不到的收获。
给大家总结几句话:
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成员可以被派生类访问;
3.基类的private成员不能被派生类访问,但是基类的protected成员可以被派生类访问。
2万+




被折叠的 条评论
为什么被折叠?



