Effective C++学习有感--第六章 继承与面向对象设计(一)

来源:互联网 发布:深圳gis数据下载 编辑:程序博客网 时间:2024/06/05 14:14
 

        最近从图书馆借了一本Effective C++, 仰慕Scott Meyers和侯捷大师的心情,十分膜拜的读了这本书,就像导读里面说的那样,“阅读本书的一个方式是,从你感兴趣的条款开始,然后看他逐步把你带往何方”,因此对我来说,就从继承与面向对象开始把。

 

心得1:Public继承是is-a的关系!

        Public继承是一种is-a的的关系,也就是一种“是”的关系,即如果Class D(Derived)以Public的形式继承Class B(Based),你便是告诉C++编译器(以及你代码的读者)说,每一个类型D对象同时也是一个B对象,反之不成立,B可能会比D表现持更一般化的概念,而D比B更加的特殊化,即学生是Public继承人,即学生一定是人,但是人不一定是学生,这就是一种is-a的关系!对继承有一种深入的理解。

        一定要牢牢记住这个条款,因为这是一条非常非常重要的条款,记住它可能会叫你一辈子受用!这里面有一个例子会叫你更加深刻的理解这个条款。

         企鹅是一种鸟,鸟可以飞,但是企鹅不会飞,这就会产生一种错觉,企鹅和鸟是一种is-a的关系,企鹅继承于鸟,鸟会飞,企鹅就是鸟,那么企鹅就会飞,这个就不成立。这是我们是英语的牺牲品,我们的意思是鸟可以飞,但不是说所有的鸟都会飞,我们要说的事一般的鸟会飞,而且是有一些鸟不会飞,接下来解释如何处理这个问题,也会更深入的理解继承的概念。

心得2:区分接口继承和实现继承

         继承就像遗传一样,在上面的那个例子中,这个观点就可以很好的解决这个问题,遗传的话就是继承的东西,当然也就有变异的东西,这个在c++里就是有三种形式来表现的:Pure-Virtual(纯虚函数),Impure-Virtual(非纯虚函数),Non-Virtual(非虚函数),而这三种不同的声明就完全解决上面的继承与变异的问题。

  1. Pure-Virtual(纯虚函数):指定接口继承,也就是父类只提供接口,但是不提供默认的实现,这也就是虚基类,也就是不能用来创建对象,一个例子就是一个Shape类里面会有一个draw的成员函数,会设置成纯虚函数,因为Shape类并不会话,他只是一个纯虚的基类,不会实现功能,但是Shape的所有子类都会有自己的实现,例如园、矩形等就会有各自的draw方法,这也就是接口继承,父类不会有实现,但是他的子类一定会有这种方法,这就是纯虚函数的用法。
  2. Impure-Virtual(非纯虚函数):指定接口继承和缺省的实现继承。如果父类的有这个功能的接口要求子类必须有自己的实现,但是父类也可以有自己的缺省实现,这些就是相当于子类相对于父类的变异的那一部分,和纯虚函数的区别就是,纯虚函数没有提供缺省的实现。
  3. Non-Virtual(非虚函数):指定接口继承和强制性实现。这就相当于遗传的部分,这些就是这些所有的类的共性的部分。  

        万物皆相通,能用C++表示如此现实的世界,也是非常强大的。

心得3:避免遮掩继承而来的名称

         这个条款里描述的名字的作用域问题与编译器如何进行名字的查找,其实这点并不是很难,编译器会再这个变量出现的作用域一点一点的向外查找,知道查到这个变量的定义式为止。

         其实在声明一个类的同时,也就同时确定了一个作用域,因此也就可以用“::”这个作用域来表示类里面的静态变量,因此如果想要子类里调用父类的成员变量或者成员函数的话只需要用“::”作用域标示符来进行调用。

        父类和子类的作用域可以表示为,子类的作用域被嵌套在父类的作用域里,因此就是发生了因为继承而遮掩了父类里名称,其实这就是作用域的问题,搞明白了也就不是很难了!

                                                                    

原创粉丝点击