类的继承
2015-07-23 22:47
190 查看
类的继承有3种方式:
1、公有继承 2、保护继承 3、私有继承
公有继承:它建立了一种is-a关系,即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。
这种关系称为is-a-kind-of(是一种)关系可能更准确,但通常使用术语is-a。
公有继承不能建立is-like-a关系,也就是说,它不采用明喻。
公有继承不建立is-implemented-as-a(作为……来实现)关系。
公有继承不建立uses-a关系。
多态公有继承:
有两种重要的机制可以实现多态公有机制:
1、在派生类中重新定义基类方法
2、使用虚方法
虚函数的作用:
如果没有使用关键字virtual,程序将根据引用类型或指针类型来选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。
经常在基类中将派生类会重新定义的方法声明为虚方法。方法在基类中被声明为虚的后,它在派生类中将自动成为虚方法。然而,在派生类声明中使用关键字virtual来指出哪些函数也不失为一个好办法。
注意:如果要在派生类中重新定义基类的方法,通常应将基类方法声明为虚的。这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。为基类声明一个虚析构函数也是一种惯例。
派生类并不能直接访问基类的私有数据,而必须使用基类的公有方法才能访问这些数据。访问的方式取决于方法。构造函数使用一种技术,而其它成员函数使用另一种技术。
派生类构造函数在初始化基类私有数据时,采用的是成员初始化列表。非构造函数不能使用成员初始化列表。
但派生类方法可以调用公有的基类方法。标准技术是使用作用域解析运算符来调用基类方法。
静态联编和动态联编:
在编译过程中进行联编称为静态联编(static binding),又称早期联编。
动态联编与通过指针和引用调用方法相关。指向基类的引用或指针可以引用派生类对象,而不必进行显式类型转换。
将派生类引用或指针转换为基类引用或指针称为向上强制转换(upcasting)。这使仅有需要进行显式类型转换。
相反地,将基类指针或引用转换为派生类指针或引用——称为向下强制转换(downcasting)。如果不使用显式类型转换,则向下强制转换是不允许的。
因此,隐式向上强制转换使基类指针或引用可以指向基类对象或派生类对象,因此需要动态联编,C++使用虚成员函数来满足这种需求。
总之,编译器对非虚方法使用静态联编,对虚方法使用动态联编。
1、公有继承 2、保护继承 3、私有继承
公有继承:它建立了一种is-a关系,即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。
这种关系称为is-a-kind-of(是一种)关系可能更准确,但通常使用术语is-a。
公有继承不能建立is-like-a关系,也就是说,它不采用明喻。
公有继承不建立is-implemented-as-a(作为……来实现)关系。
公有继承不建立uses-a关系。
多态公有继承:
有两种重要的机制可以实现多态公有机制:
1、在派生类中重新定义基类方法
2、使用虚方法
虚函数的作用:
如果没有使用关键字virtual,程序将根据引用类型或指针类型来选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。
经常在基类中将派生类会重新定义的方法声明为虚方法。方法在基类中被声明为虚的后,它在派生类中将自动成为虚方法。然而,在派生类声明中使用关键字virtual来指出哪些函数也不失为一个好办法。
注意:如果要在派生类中重新定义基类的方法,通常应将基类方法声明为虚的。这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。为基类声明一个虚析构函数也是一种惯例。
派生类并不能直接访问基类的私有数据,而必须使用基类的公有方法才能访问这些数据。访问的方式取决于方法。构造函数使用一种技术,而其它成员函数使用另一种技术。
派生类构造函数在初始化基类私有数据时,采用的是成员初始化列表。非构造函数不能使用成员初始化列表。
但派生类方法可以调用公有的基类方法。标准技术是使用作用域解析运算符来调用基类方法。
静态联编和动态联编:
在编译过程中进行联编称为静态联编(static binding),又称早期联编。
动态联编与通过指针和引用调用方法相关。指向基类的引用或指针可以引用派生类对象,而不必进行显式类型转换。
将派生类引用或指针转换为基类引用或指针称为向上强制转换(upcasting)。这使仅有需要进行显式类型转换。
相反地,将基类指针或引用转换为派生类指针或引用——称为向下强制转换(downcasting)。如果不使用显式类型转换,则向下强制转换是不允许的。
因此,隐式向上强制转换使基类指针或引用可以指向基类对象或派生类对象,因此需要动态联编,C++使用虚成员函数来满足这种需求。
总之,编译器对非虚方法使用静态联编,对虚方法使用动态联编。
相关文章推荐
- OC学习笔记01-类的声明实现与对象创建,方法声明实现与调用及传参
- SQL on Haoop/Spark
- 二叉堆
- UIAPPdelegate
- Memcache内存分配机制
- 在C++中实现foreach循环,比for_each更简洁!
- 《中国十亿城民——人类历史上最大规模人口流动背后的故事》:中国城市化将继续,城市对外来务工者应该更友好更包容,三星
- 《大国诸城:21世纪中国城市与区域竞争 (在这里读懂中国经济)》 比较国内重要城市、区域的经济活力,挺有意思。三星。
- 回调机制 Android
- c++引用的说明与理解
- 股票学习(技术指标02)
- 什么是光栅操作
- jquer 中常用改变display
- OS X 和 iOS 中的多线程技术
- 码农《一》
- Oracle笔记(三)单行函数
- 协议支撑
- 《SQL Server 管理与维护指南》章节目录
- Android设置背景透明度
- 多校第一场1010