1.pubulic继承是一种套娃继承,但凡基类对象能出现的位置,派生类对象是可以替代这个位置的。
2.如果继承了base类中的函数并且想要重载这个函数是,必须在派生类中使用using base:::func,(注意使用using的时候不要再函数后面加小括号)这样才不至于因为函数的重载而导致掩盖掉基类的同名函数。如果派生类以private方式继承基类,并且指向继承基类的多个重载函数之一时,此时using声明派不上用场,因为这样做会使得基类中的所有重载函数都在派生类中可见。此时派生类可以设计一个转交函数,并在转交函数中清楚地写出要使用的是基类中的哪一个函数,比如base::func()。总之,为了使别遮掩的基类函数重建天日,可以使用using来拯救一群或者使用转交函数来单独拯救某一个。
3.区分接口继承和实现继承:纯虚函数是为了派生函数只继承接口,实际上在基类中声明的纯虚函数,虽然这个基类是不能被实例化的,但是我们仍然可以为这个纯虚函数定义一个实现,这样就可以露一手绝活:派生类对象可以通过使用derived_object->base_class::pure_virtual_func()来真实地调用这个看似无用的实现。不同于纯虚函数,虚函数的目的则是,派生函数可以继承它的接口以及,缺省实现。假如在应用实践中,很多的派生类都可以使用这个缺省实现,那么何乐而不为呢?但是一旦有新的需求出现了,比如一个心得派生类对象需要针对这个接口做不同的解释时,就有可能因为没有重新定义虚函数接口而酿成大错。为了解决这个问题,我们可以采取“virtual函数接口”和“缺省实现”之间的链接。比如基类可以定义一个纯虚函数的同时,再定义一个别名的函数缺省实现,然后派生类在继承这个基类时,就会不得不重新定义这个纯虚函数,但是他们也有了一个选择就是直接在重新定义的虚函数中调用这个缺省实现。而其实这个缺省实现完全不必在基类中通过别名来完成,可以直接在基类中定义纯虚函数的实现,并把它作为派生类虚函数实现中的默认调用。
4.除了脑海中默认的virtual函数的声明和定义之外,还有其他的virtual函数设计替代方案。比如将virtual函数声明在private中的NVI手法、strategy模式等等。
5.我们知道,一个指向基类对象的指针,可以指向不同的派生类。在这个描述中,这样的指针实际上是有自己的类型的,但是它指向的对象却不必非要是基类对象。我们称这个指针为静态类型,而动态类型表示目前所指对象的类型。绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值是静态绑定,而virtual函数却是动态绑定。
6.使用private继承意味着派生类只是纯粹地想继承一些技术,而不想跟基类有任何观念上的联系,因此它跟函数的复合很像,但是我们应该尽可能使用复合而并非私有继承。因为私有继承的时候基类的函数会变成私有的部分,此时客户很可能被误导去调用它。
7.继承真的有点麻烦。。