摘要:
前言:迭代的是人,递归的是神。——L. Peter Deutsch展开递归调用,是分析递归的利器。进行数学归纳,是使用递归的利器。对初学者而言,讲一大堆理论,不如举一个例子。本系列分三篇分析及使用递归。第一篇——递归调用的分析第二篇——递归调用的初步使用第三篇——递归调用的进阶使用一、递归调用的一般结构。递归函数一般有如下特征:recursionFun(){ //第一部分:递归结束条件,前期处理。 if 递归结束条件 return; //第二部分:递归调用。 recusionFun(); //第三部分:递归调用后期处理,也可能有return语句。}二、递归调用的4种形式。下面看递归调用的4种形 阅读全文
摘要:
该条款最终结论:任何条件下都要禁止重新定义继承而来的非虚函数。 或者说,应该避免“隐藏”现象的发生(所谓隐藏,即派生类重新定义基类的非虚函数)。另一个概念“覆盖”即对虚函数的重新实现的发生是正常的。 从继承和实现的角度看,虚函数是一个接口,实现可以不同,或者说特性可以不同。但是非虚函数表示一种固有的不变的特性,所以不要改变这个不变的特性,否则违背公有继承“是一个”的原则。 class A{pu... 阅读全文
摘要:
注:下面所说虚函数指不是纯虚函数的普通虚函数。 这里所说的接口继承,指的是继承基类的纯虚函数;实现继承指的是继承基类的虚函数或者普通函数。 本条款实际上讲的是使用纯虚函数还是虚函数的问题。 这个条款概括起来就是: 如果基类不需要实现,实现在派生类中,那么基类中定义纯虚函数; 如果基类有默认实现,某些派生类可能会重新定义实现,那么基类中定义虚函数; 如果派生类完全继承基类的实现,不需任何改变,那... 阅读全文
摘要:
class Person { ... }; class Student: // 这一次我们 private Person { ... }; // 使用私有继承 void dance(const Person& p); // 每个人会跳舞 void study(const Student& s); // 只有学生才学习 Person p; // p是一个人Student s; // s是一个... 阅读全文