第十五章 面向对象编程
好久没有继续写了,证明了我的懒惰。。。其实现在回来写,只是把这件事完成,以前看到过一句话,当你决定做件事情,而后来发现这件事可以不做的时候,还是应该简单的继续完成以给它做一个结尾工作,,于是继续回来,经过前面三部分的学习,c++基础部分已经结束了,到这里,就可以使用c++,并且使用简单的类封装来进行编程工作了。但是这样的编程工作,基本和c面向过程开发差不多,并不能提高开发效率,于是接下来的便开始学习c++Primer的第四部分,面向对象编程与泛型编程。
对于数据封装,就是把数据和函数封装到一个类中,让这个类来完成一份工作;继承则是子类对父类的数据和方法进一步扩充;对于动态绑定,则是重中之重,面向对象的关键思想是多态性,动态绑定完成多态,当父类指针指向对类对象时,该指针只具备父类的数据和方法,因为成员方法既是全局函数的缘故,当一个成员方法被声明为virtual时,调用成员函数的地址绑定将从编译期推迟到运行期,从而在运行的时候,通过父类指针调用virtual方法才会发生绑定,调用指针指向的具体的对象的函数,也就是父类指针指向子类成员,调用virtual方法,这两者都满足的时候,才会发生动态绑定,完成多态。在 C++ 中,基类必须指出希望派生类重写哪些函数,定义为 virtual 的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。
定义基类与派生类:如前面,定义一个类之后,其他类可以继承它,成为它的派生类,拥有父类的全部数据,再次说明,类成员函数实际上依然是普通的全局函数,所以类的大小是不包含成员方法的,只有成员数据,调用某个对象的成员函数的意思,实际上是在编译期间,把函数名替换成相应的函数入口地址,这些有编译器来完成,编译器知道哪个类拥有哪些成员方法,看起来是我们的类拥有它的成员方法似的。继承上的访问控制,一般public继承较多。子类虽然拥有父类的全部数据,但是,子类和父类依然是独立的两个类,所以子类中依然访问不到父类的数据,所以可以继承父类的set/get来操作子类从父类那里继承的私有数据,甚至可以定义和父类数据成员一样的变量名来覆盖父类的数据。
我们已经看到,每个派生类对象包含一个基类部分,这意味着可以像使用基 类对象一样在派生类对象上执行操作。因为派生类对象也是基类对象,所以存在从派生类型引用到基类类型引用的自动转换,即,可以将派生类对象的引用转换为基类子对象的引用,对指针也类似。基类类型对象既可以作为独立对象存在,也可以作为派生类对象的一部分而存在,因此,一个基类对象可能是也可能不是一个派生类对象的部分,结果,没有从基类引用(或基类指针)到派生类引用(或派生类指针)的(自动)转换。
构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。像任何类一样,如果类不定义自己的默认构造函数和复制控制成员,就将使用合成版本。
虚函数:以virtual声明,另外纯虚函数是虚函数后面加上“=0”,含有(或继承)一个或多个纯虚函数的类是抽象基类。除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象。
关于面向对象的编程,找一个小工程,把代码打一边,实现一下多态,基本就没问题了,关于细节,多用几次就差不多熟悉了,此处不在过多介绍。
正如前面说的,虽然这章很重要,但是我决定做收尾了,于是草草的写了,,还是那句话,只要拿一个小工程,打一遍代码,调试基础i,遇见想不通的,分析下,,语法上是没有问题的,当然并不是说那些高级用法,,对了,TODO一下,准备把c++关于函数调用,主要是函数指针和c++11的函数绑定这块单独写一个帖子。。这就到这里了。