钱能C++语言读书笔记(五)
1、 在高级编程中,都是用无任何牵连的干净界面来分离编程的逻辑单位的,描述界面成为一种编程的高级技巧,多继承技术也十分积极地参与了界面描述。C++标准的未来发展趋势于淡化多重继承。
2、 过程化的编程是通过函数模块化的堆积来展开的,它是一种行为抽象的编程。而基于对象的编程是通过抽象数据类型描述的数据对象来展开的。它是一种数据抽象的编程。
3、 数据结构:一系列性质相同的数据组织成一定的逻辑结构并带有自身的一系列操作。
4、 基于对象的编程的关键在于如何分类,分层于抽象。初学对象化编程时,我们只是涉及一个个独立的类,强调职责分明。但是分类到深处,必然要讨论类的层次结构中,上下层的联络问题,对象与对象之间将有错综复杂的联系,明确地获得分离这种复杂性的手段时(通过设计模式来实现分离类与类之间的紧耦合),便有进入到更高一级的编程水平了。
5、 如果是引发实际复制动作的传递,则子类对象完全变成基类对象了,这时候,便不会再有悬念了,即不会有多态了。
因为参数传递的过程中已经将对象的性质做了肯定的转变。而对于确定的对象是没
有选择操作可言的。因此说明了,就是仅仅对于对象的指针和引用的间接访问,才会发生多态现象。
6、 若使用的语言虽然支持继承,但不支持多态,则不能称为支持面向对象的编程。
7、 虚函数在继承层次结构中总是会自动地从基类传播下去的。因此,Sub类中对基类的虚函数的重新定义virtual说明可以省略。
8、 虚函数用于继承结构层次中的基类与子类。除了基类与子类的函数名词相同外,连参数类型、个数和顺序都要相同。也就是说,基类和子类的虚函数不能只是函数名重载,而是要“一摸一样”,否则,成员函数即使标记上了virtual,也不会被编译器做刮目相看的滞后处理。
9、 返回值的例外(Exception of Return)
然而有一种情况例外,因为对于一个函数的调用f(2),编译器会因为分不清下列的两个函数的声明而报错
void f(int); int f(int);
所以,如果基类和子类的虚函数正如上述的两个函数的差异,则编译器会例外地施行滞后捆绑处理。例如,下面的程序中,派生类和基类的成员函数都返回自己的对象的指针类型不同,则对象指针不同,但其任然具有虚函数的作用:
Demo代码如下:
运行结果:
编译器认为在同一个继承体系中的两个函数Base * afn() 和 Sub * afn()是同行的,所以标记为virtual之后,x.afn()便具有多态行为,编译会进行滞后捆绑处理。编译的这个例外也是合理的,如果一个函数正在处理Sub类的对象,则它仍可以通过返回的Sub对象指针,继续处理Sub对象,这似乎更自然一些。