protected与public的区别 (protection)
本文目录导航:
protected与public的区别
public protected private2009-08-06 16:03一,作为数据成员润色符:public, private, protected这三个主要词,对类成员访问和在基类承袭时启动的访问形式限定符。
在成员访问形式中: public 示意共有;类的数据成员和函数可以被该类对象和派生类访问。
private 私有型;自己的类可以访问,但派生类不能访问。
protected 包全型;自身类和派生类可以访问相当于自身的private型成员,它同private的区别就是在看待派生类的区别上,C++中 public,protected, private 访问标号小结第一:private, public, protected 访问标号的访问范畴。
private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其余访问,该类的对象也不能访问。
protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。
public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其余类的成员函数;设为友元类中的一切成员函数。
第二:类的承袭前方法属性变动。
private 属性不能够被承袭。
经常使用private承袭,父类的protected和public属性在子类中变为private;经常使用protected承袭,父类的protected和public属性在子类中变为protected;经常使用public承袭,父类中的protected和public属性不出现扭转;如下所示: public:protected: private:public承袭 public protected无法用 protected承袭protectedprotected无法用 private承袭privateprivate无法用protected承袭和private承袭能降落访问权限。
C++中public,protected,private访问小结第一:private,public,protected方法的访问范畴. private: 只能由该类中的方法访问,不能被该类的对象访问. protected: 可以被该类中的方法和其友元函数访问,但不能被该类的对象访问 public: 可以被该类中的方法和其友元函数访问,也可以由该类的对象访问 第二:类的承袭前方法属性变动: 经常使用private承袭,父类的一切方法在子类中变为private; 经常使用protected承袭,父类的protected和public方法在子类中变为protected,private方法不变; 经常使用public承袭,父类中的方法属性不出现扭转; 二,作为承袭子类的润色符关于一个父类(基类),假设申明一个成员为private,就说明这个东东使我的,不能让其他人用,包括子孙。
假设是protected,我就会通知我的子孙,你们要小心的用,但相对不能让外人经常使用。
假设说是public,那就是说,这个东东大家随意用吧。
关于一个子类(从基类承袭而来的),private是一个悭吝的承袭者,他将从祖辈承袭上去的物品统统藏起来,不让他人碰触(包括自己的子孙)。
(当然他也只能经常使用祖辈授予其的权势,即只能经常使用祖辈中的protected和public)。
protected是一个有包全看法的承袭者,他将从祖辈承袭上去的物品,只准许自己的子孙经常使用(即使以前祖辈的物品是群众都可以经常使用的public)。
public是一个循规守据,他不关心祖辈的物品,原来是什么规矩就是什么在承袭时采地下(public)承袭的方式来承袭一个类别时,父类别与子类别为is-a的相关,子类别承袭父类别的地下(public)介面及受包全(protected)的成员,子类别是父类别的细化型态。
包全(protected)承袭可以扭转承袭上去的基底类别成员权限,包全的意思就是让这些成员承袭上去之后,包全它们仅能在类别与衍生类别中经常使用,包全承袭的语法如下所示: class B : protected A { // 实作 };包全承袭时经常使用protected来承袭基底类别,承袭上去的成员在衍生类别中的权限变为如下:基底类别 衍生类别private 不承袭protected protectedpublic protected 便捷的说,原来的权限在protected以下的保管其原来权限,而在protected以上的就降为protected,子类别protected承袭的目标在只宿愿保管父类别中已实作的地下成员与受包全的成员为己用或接上去的衍生类别经常使用,并提供自己的地下介面。
您也可以在承袭基底类别之后,将它一切的成员一概改为私用(private),经常使用私用(private)承袭可以到达这个目标,其语法如下: class B : private A { // 实作 }; 基底类别中的成员在被承袭之后,其权限如下所示: 基底类别 衍生类别private 不承袭protected privatepublic private private承袭被称为“实作承袭”,象征着子类别只想保管父类别中已实作的地下与受包全的成员为己用,并提供自己的地下介面与接上去会被承袭的受包全的成员。
字段限定符的体现方式
限定符是用于限定类型和类型成员的申明。
蕴含访问限定符、abstract、const、event、extern、override、sealed、static、virtual等。
访问限定符是用于指定成员或许类型的可访问性的主要字。
● protected
上方的五种可访问级可以经过经常使用访问限定符启动指定:
public protected internal internal protected private
abstract 限定符被用于类、方法以及属性。
在类定义中经常使用abstract 限定符,标明该类仅仅用来作为其余类的基类。
形象类有以下特色:
● 形象类是不能被例示的。
● 形象类可以蕴含形象方法和存取器。
● 无法能用被封装的限定符修正形象类,即该类不能被承袭。
● 由形象类承袭而来的非形象类必定包括一切派生形象方法和存取器的实践运行。
c++幽默现象:private的成员函数可以在类的外部调用?
发现新大陆了呵呵,不错,然而,它并不是C++的毛病或是被设计者所漠视的疑问。
当咱们经常使用虚函数的时刻,它的访问规定是在申明的时刻被确定的,而不是在被“子类重写”(overridden)的时刻,虚函数的访问规定不会遭来到自被重写的子类函数的影响,更进一步说,当某个对象A的援用B(特指直接访问)用来调用该对象的虚函数时,关于该对象A的一切申明消息,都取决于该对象的援用B,而不是这个援用所援用的对象A。
C++规范里有对该疑问的详细说明:当一个子类函数经过基类的指针调用时,访问权限取决于基类对该函数的申明。
参考C++ Standard ISO/IEC :2003(E) 第11.6节:11.6 Access to virtual functions []The access rules (clause 11) for a virtual function are determined by its declaration and are not affected by the rules for a function that later overrides it. [Example:class B {public:virtual int f();};class D : public B {private:int f();};void f(){D d;B* pb = &d;D* pd = &d;pb->f(); //OK: B::f() is public,// D::f() is invokedpd->f(); //error: D::f() is private}—end example]Access is checked at the call point using the type of the expression used to denote the object for which the member function is called (B* in the example above). The access of the member function in the class in which it was defined (D in the example above) is in general not known.至少咱们在程序编译时无法获知这个指针的值,它会指向何种位置。
阅历:private仅仅是一个访问限定符,它只限定函数和数据不能被“直接”访问,而不担保这些函数和数据会被经过其余方法直接地访问到,在成员函数中前往一个类私有数据成员的援用也是这个情理。
另外,假设不是不凡的须要,普通来说,这并不是一个好的设计,有点自找费事的滋味!