您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > C++-派生类与继承
第4章派生类与继承–继承•在已有类的基础上建立一个新类的过程称为继承•被继承的已有类称为基类(父类)–派生•在已有类的基础上新增自己的特性(属性与行为)而产生新类的过程称为派生•派生出的新类称为派生类(子类)继承与派生的目的:实现代码的重用与扩充4.1派生类的概念4.1.1继承–单继承•派生类只从一个基类派生动物狗鸟–多重继承•一个派生类有两个或多个基类雇员管理人员销售人员销售经理–多级派生(多层派生)•派生类又作为基类,继续派生新的类几何形状圆矩形长方形正方形4.1.2派生类的声明class派生类名:[继承方式]基类名{//派生类新增的数据成员和成员函数};继承方式:规定了如何访问从基类继承的成员,可以是private,protected,public三种方式.//定义一个基类classPerson{public:voidprint(){//……}protected:stringname;intage;charsex;};//定义一个派生类classEmployee:publicPerson{public:voidprint1(){……….}private:stringdepartment;floatsalary;};由类Person继承出类Employee有三种继承方式(1)公有继承classemployee:publicperson{//…};(2)私有继承classemployee:privateperson{//…};(3)保护继承classemployee:protectedperson{//…};4.1.3派生类的构成派生类除了可以从基类继承成员外,还可以增加自己的数据成员和成员函数.这些新增的成员正是派生类不同于基类的关键所在,是派生类对基类的发展.Person类stringname;intage;charsex;voidprint();Employee类stringname;intage;charsex;voidprint()继承新增(发展)stringdepartment;floatsalary;voidprint1();继承与派生的目的:实现代码的重用与扩充构造一个派生类一般过程:(1)派生类从基类接收成员C++继承中,派生类把基类的全部成员(构造函数与析构函数除外)接收过来.(2)调整从基类接收来的成员(3)在派生类中增加新成员.4.1.4基类成员在派生类中的访问属性派生类继承基类中全体成员(除了构造函数与析构函数).这些成员的访问属性在派生程中可以调整.从基类继承来的成员在派生类的访问属性是由继承方式控制.class派生类名:[继承方式]基类名{//…….}继承方式为public,protected,private.不同的继承方式,导致不同访问属性的基类成员在派生类的访问属性有所不同.用公有继承方式建立的派生类称为公有派生类用私有继承方式建立的派生类称为私有派生类用保护继承方式建立的派生类称为保护派生类基类中的成员在公有派生类中的访问属性在私有派生类中的访问属性在保护派生类中的访问属性私有成员公有成员保护成员不可直接访问公有保护不可直接访问私有私有不可直接访问保护保护表:基类成员在派生类中的访问属性4.1.5派生类对基类成员的访问规则类的继承方式有public(公有继承)protected(保护继承)private(私有继承)不同的继承方式导致原来具有不同访问属性的基类成员在派生类中的访问属性不同.派生类对基类成员的访问形式有以下两种:(1)内部访问,派生类的新增成员函数对基类继承的成员的访问(2)对象访问,在派生类的外部,以派生类的对象对基类继承来的成员的访问.1.私有继承的访问规则基类成员private成员public成员protected成员内部访问对象访问不可访问不可访问可访问不可访问可访问不可访问基类中的private成员,既不能被派生类的对象访问,也不能被派生类的新增成员函数访问(内部访问)..classBase{public:voidsetx(intn){x=n;}voidshowx(){coutxendl;}private:intx;}classDerived:privateBase{public:voidsetxy(inin,intm){setx(n);y=m;}voidshowxy();{coutx;coutyendl}private:inty;}intmain(){Derivedobj;obj.setx(10);obj.showx();obj.setxy(20,30);obj.showxy();return0;}╳╳╳2.公有继承的访问规则基类成员private成员public成员protected成员内部访问对象访问不可访问不可访问可访问可访问可访问不可访问classBase{public:voidsetxy(intm,intn){x=m;y=n;}voidshowxy(){coutxyendl;}private:intx;protected:inty;}classDerived:publicBase{public:voidsetxyz(inim,intn,intl){setxy(m,n);z=l;}voidshowxyz();{coutx;couty;coutz;}private:intz;}intmain(){Derivedobj;obj.setxyz(30,40,50);obj.showxy();obj.y=60;obj.showxyz();return0;}╳╳3.保护继承的访问规则基类成员private成员public成员protected成员内部访问对象访问不可访问不可访问可访问不可访问可访问不可访问4.2派生类的构造函数与析构函数•派生类继承了基类的成员,实现了代码的重用,引入继承更主要的目的是代码的扩充.所以,只有在派生类中加入新成员,派生才更有实际意义.•派生类不能继承基类的构造函数,在派生类中对新增成员的初始化,加入派生类的构造函数,基类继承下来的成员初始化有基类构造函数完成.•同样,当搞清对象时,也需要加入派生类的析构函数来执行清理工作.4.2.1派生类构造函数和析构函数的执行顺序当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤消派生类的对象时,则先执行派生类的析构函数,随后再执行基类的析构函数.例:classBase{public:Base(){coutConstructingbaseclass\n;}~Base(){coutDestructingbaseclass\n;}};classDerive:publicBase{public:Derive(){coutConstructingderivedclass\n;}~Derive(){coutDestructingderivedclass\n;}};intmain(){Deriveop;return0;}ConstructingbaseclassConstructingderivedclassDestructingderivedclassDestructingbaseclass4.2.1派生类构造函数和析构函数的构造规则1.简单派生类的构造函数当基类的构造函数没有参数,或没有显示定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数.当基类含有带参数的构造函数时,由于派生类不能继承基类的构造函数与析构函数,此时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径.在C++中派生类构造函数的一般形式为:派生类名(参数总表):基类名(参数表){//……派生类新增数据成员的初始化语句}其中:基类构造函数的参数,通常来源于派生类构造函数的参数总表.也可用常数值.classStudent{public:Student(intnumber1,stringname1,floatscore1){number=number1;name=name1;score=score1;}voidprint(){cout“number:”numberendl;cout“name:”nameendl;cout“score:”scoreendl;}protected:intnumber;stringname;floatscore;}classUStudent:publicStudent{public:UStudent(intnumber1,stringname1,floatscore1,stringmajor1):Student(number1,name1,score1){major=major1;}voidprint1(){print();cout“major:”majorendl;}private:stringmajor;};intmain(){UStudentstu(001,”张三”,95,”信息工程”);stu.print1();return0;}说明:(1)可以将派生类的构造函数定义在类的外部,类体内只写该函数的声明.在类中声明派生类的构造函数时,不包括基类构造函数名及其参数表.只在类外定义构造函数时才将它列出来.classUStudent:publicStudent{public:UStudent(intnumber1,stringname1,floatscore1,stringmajor1);voidprint1(){print();cout“major:”majorendl;}private:stringmajor;};UStudent::UStudent(intnumber1,stringname1,floatscore1,stringmajor1):Student(number1,name1,major1){major=major1;}(2)如果基类使用默认构造函数或不带参数的构造函数,则在派生类中定义构造函时可以去掉”:基类构造函数名(参数表)”,此时若派生类不需要构造函数,则可不定义派生类的构造函数.派生类名(参数总表){//……派生类新增数据成员的初始化语句}(3)当基类的构造函数不带参数时,派生类不一定需要定义构造函数,然而当基类的构造函数哪怕只带一个参数,它所有的派生类都必须定义构造函数,甚至所定义的派生类函数可能为空,仅仅起到参数传递作用.2.派生类的析构函数在派生类中可以根据需要定义自己的析构函数,用于对派生类中新增加的成员进行清理工作,基类的清理工作仍然由基类的构造函数负责.析构函数是无参的函数.3.含有对象成员的(子对象)的派生类的构造函数当派生类中含有内嵌的对象成员(子对象)时,其构造函数的一般形式为:派生类名(参数总表):基类名(参数表0),对象成员名1(参数表1),……,对象成员名n(参数表n){//派生类新增数据成员的初始化语句}在定义派生类对象时,构造函数执行顺序(1)调用基类的构造函数(2)调用内嵌对象成员的构造函数(内嵌对象成员有多个,执行顺序与在类中的声明顺序一致)(3)调用基类的构造函数撤消对象时,析构函数的调用顺序与构造函数正好相反classBase{public:Base(inti){x=I;cout“Constructingbaseclass\n”;}~Base(){cout“Destructingbaseclass\n”;}voidshow(){coutxendl;}private:intx;};classDerived:publicBase{public:Derived(inti):Base(i),d(i){cout“Constructingderivedclass\n”}~Derived(){cout“Destructingderivedclass\n”}private:Based;}intmain(){Derivedobj(5);obj.show();retur
本文标题:C++-派生类与继承
链接地址:https://www.777doc.com/doc-5368391 .html