C++基础--基类和派生类
2008-09-02 14:42
176 查看
C++基础--基类和派生类 (1)
C++基础--基类和派生类 (2)
C++基础--基类和派生类 (3)
继承的定义及工作方式 继承的一般形式如下: class 派生类:访问权限 基类 { … } 如果需要,派生类可以从多个基类继承,也就是多重继承,这将在后面章节中讲解。通过继承,派生类自动得到了除基类私有成员以外的其它所有数据成员和成员函数,在派生类中可以直接访问,从而实现了代码的复用。 从概念上讲,基类和派生类的关系与类和对象的关系有着根本的不同。比如说,我们定义了猫科动物类: class felid { //类中定义了猫科动物的基本特征 }; 现在由于某种需要,我们想对猫这个动物进行定义。猫是猫科动物的一种,很自然,我们就想到从猫科动物这个类里面派生: class cat: public felid { char name[20] //名字 char color[80] //毛色 cat(); cat(char* name, char* color); } 在类cat中,示意性地定义了两个变量。我们知道,对象是类的一个实例,而在这里,cat还是一个类,一个更加具体的类,不是felid类的对象,这一点要分辨清楚。我们可以定义猫的一个对象(实例): cat mycat("Jack","bronze"); mycat才是一只实实在在的猫对象。 派生类对象生成时,要调用构造函数进行初始化。编译器的调用过程是先调用基类的构造函数,对派生类中的基类数据进行初始化,然后再调用派生类自己的构造函数,对派生类的数据进行初始化工作。当然,在派生类中也可以更改基类的数据,只要它有访问权限。 基类数据的初始化要通过基类的构造函数,而且,它要在派生类数据之前初始化,所以基类构造函数在派生类构造函数的初始化表中调用: 派生类名 (参数表1):基类名(参数表2) 其中"参数表1"是派生类构造函数的参数,"参数表2"是基类构造函数的参数。通常情况下,参数表2中的参数是参数表1的一部分。也就是说,用户应该提供给派生类所有需要的参数,包括派生类和基类的。事实上也是这样,派生类继承了基类的成员变量,就相当于是自己的一部分,当然有责任对基类的变量进行初始化,只不过对于基类成员的初始化要借助于基类的构造函数而已。如果派生类构造函数没有显式调用基类的构造函数,编译器也会先调用基类的缺省参数的构造函数,对基类数据进行初始化。如果派生类自己也没有显式定义构造函数,那么编译器会为派生类定义一个缺省的构造函数,在生成派生类对象时,仍然先调用基类的构造函数。所以,派生类没有定义构造函数的话,必须保证基类有缺省参数的构造函数。 2 类的继承访问特性
|
3 函数的隐藏与覆盖 我们已经知道了函数的重载是怎么回事,重载的函数名字相同,但它们的参数个数和类型不同。函数的隐藏和覆盖,与函数的重载不同,它们只是在继承的情况下才存在。 如果在派生类中定义了一个与基类同名的函数,也就是说为基类的成员函数提供了一个新的定义,有两种情况: ◇ 在派生类中的定义与在基类中的定义有完全相同的信号(signature)(即参数个数与类型均相同)和返回类型,对于普通成员函数,这便称之为重定义;而对于虚成员函数(在本章的后面介绍),则称之为覆盖。 ◇ 在派生类中,改变了成员函数参数表与返回类型。此时会出现什么情况? 在派生类中重定义基类的成员函数,会隐藏基类的该成员函数,例如:
b.a::a(1); b.a::a(1.0); 4 不合适的继承 继承和派生有一个基本的原则,就是基类对象能够使用的地方,也能用同样的方法使用派生类的对象。 下面是一个破坏了这个原则的实例,BoundedStack时从Stack派生的,Stack类支持基本的栈操作,即压入一个元素到栈中和从栈中弹出一个元素,如例11-8。 在该类中,隐含push成员函数总能压入一个新的元素到栈中。有时,我们可能需要只能压入固定元素个数的栈。为了复用Statck类的实现,从Statck类派生了一个BoundedStack类,如例11-9。 但是,这破坏了上面提到的基本的原则:基类对象能够使用的地方,派生类对象也能够被使用。例如,假定BoundedStack的capacity成员设置为5,即栈中最多只能有5个元素,则压栈次数超过5,则会出错。 之所以从Statck派生BoundedStack,只是为了复用Statck类的代码,其实,我们也可以用组合的方法复用代码,所谓组合是指用一个类的对象作为另一个类的数据成员,如例11-9。 现在我们对这个原则可能还理解不深,在学习了多态的概念后,对这个原则会有更深的理解。
当某一个类A希望拥有另一个类B的性能,但又不希望类B的接口成为类A的接口,或者类B是类A的一个组成部分,就使用组合,而不要使用继承。例如,一台电脑可以由一个主机,一个显示器和一个键盘组成。用类描述可以是:
|
5 多继承 我们前面介绍的内容中,一个派生类继承一个基类,我们称之为单继承。C++也支持多继承,即一个派生类继承多个基类,参见图11-1。
|
相关文章推荐
- C++学习基础之基类和派生类
- C++基础之基类派生类指针间强转问题(基类派生类傻傻分不清)
- C++语言基础 例程 基类与派生类的转换
- C++派生类对象访问基类的protected成员
- C++ 基类和派生类
- C++ 学习之继承1:基类与派生类
- C++派生类函数调用基类的函数
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++:派生类的默认构造函数和拷贝构造函数调用基类构造函数的机制(含程序验证)
- c++基类和派生类
- c++派生类和基类的构造函数和析构函数
- C++ 派生类到基类转换的可访问性
- C++ 基类 派生类 互相转换 调用关系
- c++primer plus第十三章-派生类与基类
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
- C++中的基类与派生类
- C++中派生类对基类成员的三种访问规则
- C++基础 protected (无继承时,protected可等同private;有继承时,在派生类会有不同。)
- C++语法基础--派生类的构造函数,赋值操作符,析构函数,虚析构函数
- C++派生类对象访问基类的protected成员