首页 > 代码库 > c++ public protected private 继承
c++ public protected private 继承
1:访问控制
1.1 public 这类型成员可以被类本身函数访问,也可以被外部创建的类对象调用。子类对象与子类内部可以访问
1.2 protected类型成员,只能被类本身函数访问。外部创建的类对象没有访问权限。子类对象没有访问权限,子类内部可以访问
1.3 private类型成员,只能被类本身函数访问,外部创建的类对象没有访问权限。子类对象和子类内部都没有访问权限
class TestObject{public: void Function(); void TestPublic();protected: void TestProtected();private: void TestPrivate();};void TestObject::Function(){ TestPublic(); TestProtected(); TestPrivate();}int main(){ TestObject obj; obj.TestPublic();//yes obj.TestProtected();//error obj.TestPrivate();//error}
2:继承关系的访问控制
2.1 public继承。public继承使子类顺延父类的访问控制属性,即成员保持父类的控制属性,这样在子类中的成员访问控制同父类的一样
class Base{public: Base(void); ~Base(void); void TestPublic();protected: void TestProtected();private: void TestPrivate();};void Base::TestPublic(){ cout<<"TestPublic"<<endl;}void Base::TestProtected(){ cout<<"TestProtected"<<endl;}void Base::TestPrivate(){ cout<<"TestPrivate"<<endl;}class Child : public Base{public: Child ();};Child ::Child (){ child.TestPublic();//yes TestProtected();//yes TestPrivate();//error}int _tmain(int argc, _TCHAR* argv[]){ Child child; child.TestPublic();//yes //child.TestProtected();//error //child.TestPrivate();//error return 0;}
2.2 protected继承,将父类public和protected属性的成员属性顺延到子类来后变成protected属性。protected属性是可以提供给子类在内部访问的。
如上代码,如果改为protected继承。则内部访问保持和public继承的不变,而在外部,由于父类public属性被更改为protected的属性,则在外部创建的子类对象没有了访问权限。
class Child :protectedBase{}Child ::Child (){ child.TestPublic();//yes TestProtected();//yes TestPrivate();//error}int _tmain(int argc, _TCHAR* argv[]){ Child child; //child.TestPublic();//error //child.TestProtected();//error //child.TestPrivate();//error return 0;}
2.3 private继承。这种继承方式中断了后续子类对当前类的父类的所有访问权限,在该种继承方式下,会将父类public和protected属性顺延成private属性。这样,几时后面子类再次继承,都没有了对当前父类的成员的访问权限。
class Child :privateBase{}Child ::Child (){ child.TestPublic();//yes TestProtected();//yes TestPrivate();//error}class Mini :public Child{ public: Mini();}Mini::Mini(){ TestPublic();//error TestProtected();//error TestPrivate();//error}int _tmain(int argc, _TCHAR* argv[]){ Mini mini; //mini.TestPublic();//error //mini.TestProtected();//error //mini.TestPrivate();//error return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。