当前位置: 代码迷 >> 综合 >> c++Primer,第十五章,面向对象编程
  详细解决方案

c++Primer,第十五章,面向对象编程

热度:5   发布时间:2023-12-05 23:37:50.0

第十五章 面向对象编程

       好久没有继续写了,证明了我的懒惰。。。其实现在回来写,只是把这件事完成,以前看到过一句话,当你决定做件事情,而后来发现这件事可以不做的时候,还是应该简单的继续完成以给它做一个结尾工作,,于是继续回来,经过前面三部分的学习,c++基础部分已经结束了,到这里,就可以使用c++,并且使用简单的类封装来进行编程工作了。但是这样的编程工作,基本和c面向过程开发差不多,并不能提高开发效率,于是接下来的便开始学习c++Primer的第四部分,面向对象编程与泛型编程。

      面向对象编程基于三个基本概念:数据抽象、继承和动态绑定。在 C++ 中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员。动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数。
       对于数据封装,就是把数据和函数封装到一个类中,让这个类来完成一份工作;继承则是子类对父类的数据和方法进一步扩充;对于动态绑定,则是重中之重,面向对象的关键思想是多态性,动态绑定完成多态,当父类指针指向对类对象时,该指针只具备父类的数据和方法,因为成员方法既是全局函数的缘故,当一个成员方法被声明为virtual时,调用成员函数的地址绑定将从编译期推迟到运行期,从而在运行的时候,通过父类指针调用virtual方法才会发生绑定,调用指针指向的具体的对象的函数,也就是父类指针指向子类成员,调用virtual方法,这两者都满足的时候,才会发生动态绑定,完成多态。在 C++ 中,基类必须指出希望派生类重写哪些函数,定义为 virtual 的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。
        定义基类与派生类:如前面,定义一个类之后,其他类可以继承它,成为它的派生类,拥有父类的全部数据,再次说明,类成员函数实际上依然是普通的全局函数,所以类的大小是不包含成员方法的,只有成员数据,调用某个对象的成员函数的意思,实际上是在编译期间,把函数名替换成相应的函数入口地址,这些有编译器来完成,编译器知道哪个类拥有哪些成员方法,看起来是我们的类拥有它的成员方法似的。继承上的访问控制,一般public继承较多。子类虽然拥有父类的全部数据,但是,子类和父类依然是独立的两个类,所以子类中依然访问不到父类的数据,所以可以继承父类的set/get来操作子类从父类那里继承的私有数据,甚至可以定义和父类数据成员一样的变量名来覆盖父类的数据。
      我们已经看到,每个派生类对象包含一个基类部分,这意味着可以像使用基 类对象一样在派生类对象上执行操作。因为派生类对象也是基类对象,所以存在从派生类型引用到基类类型引用的自动转换,即,可以将派生类对象的引用转换为基类子对象的引用,对指针也类似。基类类型对象既可以作为独立对象存在,也可以作为派生类对象的一部分而存在,因此,一个基类对象可能是也可能不是一个派生类对象的部分,结果,没有从基类引用(或基类指针)到派生类引用(或派生类指针)的(自动)转换。
       构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。像任何类一样,如果类不定义自己的默认构造函数和复制控制成员,就将使用合成版本。

虚函数:以virtual声明,另外纯虚函数是虚函数后面加上“=0”,含有(或继承)一个或多个纯虚函数的类是抽象基类。除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象。

关于面向对象的编程,找一个小工程,把代码打一边,实现一下多态,基本就没问题了,关于细节,多用几次就差不多熟悉了,此处不在过多介绍。
正如前面说的,虽然这章很重要,但是我决定做收尾了,于是草草的写了,,还是那句话,只要拿一个小工程,打一遍代码,调试基础i,遇见想不通的,分析下,,语法上是没有问题的,当然并不是说那些高级用法,,对了,TODO一下,准备把c++关于函数调用,主要是函数指针和c++11的函数绑定这块单独写一个帖子。。这就到这里了。