Chinaunix首页 | 论坛 | 博客
  • 博客访问: 237947
  • 博文数量: 18
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 1870
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-09 14:42
文章分类

全部博文(18)

文章存档

2009年(2)

2008年(69)

我的朋友

分类: C/C++

2008-03-04 14:15:33

转载:


c++入门学习笔记继承

1. 继承的概念及重要性
  inheritance :是重用的一种形式,将相关的类组织起来,并分亨其间的共通数据和操作行为。
  最具吸引力的特点:新类可以从现有的类库中继承。提倡建立与现有的类有许多共性的新类来实现的重用
  能添加基类的所没有的特点以及取代和改进从基类继承来的特点
  单重继承形成树状层次结构,由基类和派生类构成了一种层次关系,继承的层次在系统的限制范围内是任意的。
继承机制定义了父子关系
2.基类
* 父类定义了所有子类共通的对外接口和私有实现内容,父类被称为基类
* 成员函数:
基类的私有成员只能被基类的成员函数和友元访问
基类的受保护成员只能被基类及派生类的成员函数和友元访问
* 继承基类的方式
public公有继承使用最多,公对公,受保护受保护,私不用 
protected:公、保护对保护, private :公、保护对私

3.派生类
* 新类继承预定义基类的数据成员和成员函数,而不必重新编写数据成员和成员函数,这种新类叫派生(derived)类
* 派生类永远不能直接访问基灶的私有成员
* 重定义函数 
派生类中无需继承的功能及要扩充的基类功能可以重定义成员函数,但在派生类再调用基类的同名函数时要用到作用域运算符Employee::print()
* 派生类的构造函数和析构函数
  由于派生类继承了基类的成员,所以在建立派生类的实例对象时,必须调用基类的构造函数来初始化派生类对象中的基类成员。可隐式的调用基类构造函数,也可在派生类的构造函数中通过给基类提供初始化值(成员初始化值列表)明确的调用构造函数
  构造函数调用顺序,先执行基类的构造函数->派生类的成员对象构造函数 ->派生类构造函数
  析构函数调用顺序正好相反。
++++++++++ 切记:派生类不继承基类的构造函数、析构函数和赋值运算符,但派生类的构造函数和赋值运算符能调用基类的构造函数和赋值运算符

4.基类 VS 派生类
  理解要点:可把基类和派生类都看成是一种类型如int
* 对象 
派生类的对象可作为基类的对象处理,也即定义的派生类对象Time t 可以访问基类的成员函数和受保护数据,派生类对象赋给基类对象也是合理的。反之则不行,基类的对象不能自动的成为派生类的对象,因为派生类有扩充基类的对象中有些没有了
* 指针
  派生类对象的指针可以隐式的转换为基类的指针。也即派生类指针可直接赋给基类指针,反之则不行
但可以用显式类型转换把基类指针强制转换为派生类指针,如要复引用该指针,要在转换前首先应该把它指向某个派生类对象(因不能引用该对象中并不存在的派生类对象) 如char * c;(int *) c;
* 两者关系 
 直接用基类指针引用基类对象:time * t,c; * t= &c; * t 返回对象c的引用 t ->(成员)
 直接用派生类指针引用派生类对象
 用基类指针引用一个派生类对象,但只能引用基类成员(在多态中很有用)
time * t, time2 c; * t = &c; * t 返回派生类的对象的引用, t ->(基类成员)
 用派生类指针引用基类对象,绝对不行。必须先强制转换为基类指针
time t, time2 * c; * c = &t, * c及 c->(成员)错误
  time t, time2 * c; * c = (time *)c c-> (成员)正确

指针操作是利用箭头成员选择运算符来访问成员的。
  无论怎样赋值,对象的引用一定要本对象有这个数据或成员函数--Skyala

5. 多重继承
* 一个类可从多个基类派生而来,这种派生叫多重继承。是一种图状层次结构(有向无环图)。注:功能强大,但易引起二义性,使用双目作用域为解决之一法
* 用法:一个类型A,是类型B,也是类型C
* 冒号后(:)加公有基类列表 class t:public d,public c {}

12,函数的覆盖:
函数的覆盖是发生在发生父类和子类之间的。(函数的重载是发生在同一个类中)
当子类中重写了父类的某些成员函数后,子类中的成员函数覆盖了父类的对应同名成员函数。

13,用父类指针访问子类对象成员时候,只能访问子类从父类继承来的那部分。(这时候外部不可以访问父类中保护和私有的部分,子类中不可访问父类私有部分。)

14,多态性:在基类的的成员函数前加 virtual 变成虚函数,当用子类对象调用该功能的成员函数时候,子类有的就调用子类的,子类没有的就调用基类的。
当C++编译器在编译的时候,发现被调用的成员函数在基类中定义的是虚函数,这个时候C++就会采用迟绑定技术(late binding),在运行的时候,依据对象的类型来确定调用的哪个函数,子类有调用子类的,子类没有的就调用基类的。
如果基类中的成员函数不是虚函数,则这时候的绑定是早期绑定,在编译的时候就已经确定该调用哪个函数。

15,纯虚函数:在类中定义时 eg: virtual void f1()=0;
纯虚函数没有函数体,含有纯虚函数的类叫做抽象类,抽象类不能实例化对象。当子类从抽象类的基类中派生出来时候,如果没有实现基类中的纯虚函数,则子类也是个抽象类,也不能实例化对象。
纯虚函数被标名为不具体实现的虚成员函数,纯虚函数可以让类只具有操作的名称而不具有具体的操作的内容,让派生类在继承的时候再给出具体的定义。如果派生类没有给出基类的纯虚函数的具体定义的时候,派生类也为一个抽象类,也不能实例化对象。







阅读(724) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux下编程宏的运用( #和##运用)

给主人留下些什么吧!~~