- 1、本文档共60页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[零点起飞学C之继承和派生
第15章 继承和派生继承和派生是父类和子类之间的关系,是从两个不同角度谈同一件事情。继承让子类可以获得父类的特性,派生让父类可以将自己的特性遗传给子类。学习本章,读者可以设计出更加满足实际需要的类,在更高的抽象层次上考虑和解决问题,从而应对更复杂的实际需要。15.1 由类生成类派生和继承都是在描述同一件事情,它们是从两个角度来谈父类和子类的关系。从已有的类遗传产生一个新的类,称为类的派生。该类被称为父类,也叫基类。新的类被称为子类。通过派生,父类将其已有的特性遗传给了子类,子类将自然拥有父类的各种特性。派生机制提供了扩展或定制基类特性的手段,子类可以增加自己独有的特性。通过类的派生就可构造可重用的类库,扩展类的特性。从子类的角度来看这件事情,即一个新类从已有的类那里获得其特性,就称为继承。从父类到子类是一个特殊化、具体化的过程,从子类到父类则是一个泛化、抽象的过程。例如,定义动物类animal,从animal派生子类dog。在这个过程中,父类animal派生了子类dog,或者说子类dog继承于父类animal。从animal还可以派生cat或chick等子类。子类也可以继续派生。例如,dog可以继续派生policedog、armydog等具体的类。从这个过程可以看出,子类和父类是一个相对的概念。dog是animal的子类,又是policedog的父类。一个父类可以派生多个子类,一个子类也可以继承于多个父类。如果一个子类只从一个父类派生,就称为单继承。如果一个子类继承于多个父类,就称为多重继承。任何一个类都可以作为父类派生新的子类,也都可以作为子类继承于其他的类。从父类派生子类时,子类可以具有:继承父类的数据成员;继承父类的成员函数;增加新的数据成员;增加新的成员函数;重新定义基类中已有的成员函数;改变现有成员的属性等特征。15.2 派生一个类派生指从父类产生子类,并将父类的所有特性遗传给子类,这个过程就叫作派生。派生将一个父类具体并特例化为新的子类,它避免了重复定义某些公有的特性,又允许子类定义自己特有的性质。本节将详细讲解如何从一个父类派生新的子类。15.2.1 派生的起点——基类基类就是父类,也可以是其他父类的子类。但是,只有派生了至少一个子类的类才能称为是基类。这个概念实质上是一个相对的概念,与普通类并没有什么特殊的区别。只要某个类派生了至少一个子类,就可以称其为基类。但是一般情况下,基类都会被定义为一个抽象的概念,它泛化了某一类事物的共有特征。因此,直接从这样的基类实例化一个对象是没有意义的。例如,直接用animal实例化一个类对象是没有任何意义的。基类的用处是常常可以定义基类的指针,从而指向子类,这在实现面向对象的多态性方面很有帮助。基类成员的下述性质将影响到子类的成员。1.private修饰符被private修饰的成员是私有成员,它对外界完全封闭的。私有成员可以被类自身的成员和友元访问,但不能被包括派生类在内的其他任何类和任何普通函数访问。2.public修饰符被public修饰的成员是公有成员,它对外界是完全公开的。公有成员可以被任何普通函数和任何类的成员函数访问,也可以被子类访问。3.protected修饰符被protected修饰的成员是保护成员,它对外界是半开半闭的。保护成员可以被类自身的成员和友元访问,还可以被派生类的成员函数访问,但不能被任何非友元的普通函数访问。?注意:好的编程习惯是尽量避免使用友元去访问私有成员,除非确实需要。因为这破坏了类的封装性。【示例15-1】 演示类成员的限定符用法。class CPerson{public: //公共成员区CPerson();virtual ~CPerson();protected: //保护成员区string m_name;bool m_sex;short m_age;public:int GetVersion(char *info);private: //私有成员区string m_ver;};分析:该示例定义了一个基类CPerson的一部分。CPerson的构造函数和析构函数被声明为公有的,这是因为该类的子类将会自动调用它们。CPerson的属性m_ver表示类的版本号,它只能通过公有成员函数GetVersion()获得。它的属性m_name、m_sex等被定义为了保护属性,只能被子类访问到。15.2.2 派生的方式派生指从基类衍生出一个新的子类。但是派生并不是把基类的成员和派生类自己增加的成员,简单地加在一起就成为派生类。构造一个派生类需要依次进行下述工作。(1)全继承:不加选择地继承基类的所有成员,但是不包括构造函数和析构函数。(2)成员调整:按照指定的继承方式和重载或覆盖方式调整基类的成员满足自己的需 要,从而实现多态。(3)重写构造函
文档评论(0)