`
runfeel
  • 浏览: 936286 次
文章分类
社区版块
存档分类
最新评论

C++ 程序设计 读后感

 
阅读更多

这本书应该算这边,已经是读的第三遍了,一直用本子做笔记,突然举得我应该把笔记心的写在博客上,便于自己的翻阅和记忆;真的是每一遍都有不同的收获,前两遍在阅读的时候,我真的还不太懂什么是C++,什么是继承、组合、virtual函数、类,但我读这边时,也就是这几天,突然举得自己有很大的提高,希望这是我开发生涯的一个好的开始,自己一定要再接再厉,不断地修炼自己;

第12章 多态和虚函数

在同一个类中是不能定义两个名字相同、参数个数和类型都相同的函数,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型相同而功能不同的函数。这是合法的,因为不在同一个类中。编译系统按照同名覆盖的原则决定调用的对象。

虚函数的作用,是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

virtual viod display();

当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中的不同类的对象,从而调用其中的同名函数。由虚函数实现动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的相应。

虚函数的使用方法是:

(1)在基类用virtual声明成员函数为虚函数。这样可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地调用。

在类外定义虚函数时,不必再加virtual.

(2)在派生类中重新第一次函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。

C++规定,当一个成员函数被声明为虚函数后,其派生类中同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加vitrual,是程序更加清晰。

如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。

(3)定义一个指向基类对象的指针变量,并使他指向同一类族中的莫以对象。

(4)通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。

函数重载处理的是同一个层次上的同名函数问题,而虚函数处理的是不同派生层次上的同名函数问题,前者是横向重载,后者可以理解为纵向重载。但与重载不同的是:同一类组的虚函数的首部是相同的,而函数重载时函数的首部是不同的(参数个数和类型不同)。

静态关联与动态关联

确定调用具体对象的过程成为关联。

函数重载和通过对象名调用的虚函数,在编译实际可确定其调用的虚函数属于那一个类,其过程称为静态关联,由于是在运行前进行关联的,故称为早期关联。函数重载属静态关联。

在运行阶段把虚函数和类对象“绑定”在一起,一次,此过程称为动态关联。这种多态性是动态多态性,既运行阶段的多态性。(也称为滞后关联);

在什么情况下应当声明虚函数:

(1)类的继承层次结构中,对基类的虚函数重新定义;

(2)一个成员函数被声明为虚函数后,在同一个类族中的类就不能在定义一个非virtual 的当该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。

当带有虚函数时,编译系统会为该类构造一个虚函数表(vtable),它是一个指针数组,存放每个虚函数的入口地址。

虚析构函数:

将基类的析构函数声明为虚函数,这将是所有的派生类的析构函数自动成为虚函数。这样,如果程序中用delete运算符准备删除一个对象,而delete运算符的操作对象是指向派生类对象的基类指针,则系统会调用相应类的析构函数。

构造函数不能声明为虚函数。这是因为在执行构造函数时类对象还未完成建立过程,当然谈不上函数和类对象的关联。

纯虚函数与抽象类

一、纯虚函数:

vittual flot area() const =0; //存续函数

这就将area声明为一个纯虚函数。纯虚函数是在声明虚函数是被“初始化”为0的函数。声明纯虚函数的一般形式是

virtual 函数类型 函数名 (参数表类)=0;

注意

1 纯虚函数没有函数体;

2 最后面的“=0”并不表示函数返回值为0 ,它只起形式上的作用,告诉编译系统“这是存续函数”;

3 这是一个声明语句,最后应该有分号;

纯虚函数只是函数 的名字而不具备函数的功能,不能被调用;可以说他是“徒有其名,而无其实”。他只是通知编译系统“在这里声明一个虚函数,留待派生类中定义”。

在派生类中对此函数提供定义后,它才能具备函数的功能,可以被调用;

纯虚函数的作用是在基类中为其派生类保留一个函数名字,以便派生类根据需要对他进行定义。如果基类中没有保留函数名字,则无法实现多态性。

二 抽象类

定义这些类的唯一目的使用它作为基类去建立派生类;

不用来定义对象而只作为一种基本类型用作继承的类,称为抽象类,由于它常用作基类,通常称为抽象基类。

凡是含有纯虚函数的类都是抽象类。因为纯虚函数是不能被调用的,包含纯虚函数的类是无法建立对象的。抽象类的作用是作为一个类族的共同基类,或者为一个类族提供一个公共接口。

在抽象类里定义的虚函数后纯虚函数,在派生类中,如果用到,就重新定义;

(1)静态关联 :

先定义类对象,然后通过类对象调用类里的函数,这属于静态关联,在编译阶段就能确定调用哪个类的函数。同时用重载运算符“<<”来输出个对象的信息,可以验证对象初始化是否正确;

(2)动态关联:

定义一个指向基类shape对象的指针变量pt ,使它先后指向3个派生类对象point,circle和cylinder,然后通过指针调用个函数,如pt->shapeName(),pt->area(),pt->volume().这时是通过动态关联分别确定应该调用那个函数。分别输出不同类对象的信息。

抽象基类结论:

(1)一个基类如果包含一个或一个以上纯虚函数,就是抽象基类。抽象基类不能也不必要定义对象;

(2)一般并不是现实存在的对象的抽象;

(3)在类的层次结构中,顶层或最上面的几层可以是抽象基类;

(4)抽象基类是本类族的公共接口;

(5)区别静态关联和动态关联;

(6)如果在基类声明了虚函数,则在派生类中凡是在该函数中相同的函数名、函数类型、参数个数和参数类型函数,均为虚函数(无论在派生类中是否用virtual声明)。

(7)使用虚函数提高了程序的可扩展性。

输入流输出流

C++的输入输出

分享到:
评论

相关推荐

    c#程序设计读书笔记

    这篇读书笔记将深入探讨C#程序设计的关键概念和重要特性,以帮助读者更好地理解和应用这种强大的语言。 一、基础语法 C#的基础语法与C++和Java有诸多相似之处,包括变量声明、数据类型(如int、float、bool等)、...

    c++编程思想及读后感

    1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺什么 10 1.3.6 方法应当提供什么 10 1.4 起草:最小的方法 12 1.4.1 前提 13 ...

    C++的设计与演化——电子书

    《C++的设计与演化》不仅对于希望深入了解C++语言本身的人来说是一本宝贵的参考资料,对于那些对计算机科学历史感兴趣的人来说也是一本值得一读的好书。通过阅读这本书,读者不仅可以学到C++语言的具体用法,还可以...

    Thinking in C++2

    6. **读后感(Thinking in C++读后感.doc)**:这个文件可能是读者阅读完《Thinking in C++》后的个人感悟和理解,分享了学习过程中的收获、难点和对C++更深层次的理解。 综合以上内容,这个压缩包提供了一个全面了解...

    C++ 文件加密源程序

    C++作为一种强大的编程语言,可以用于开发各种安全相关的应用程序,包括文件的加密和解密。本项目名为"C++ 文件加密源程序",旨在提供一种方法来保护数据文件免受未经授权的访问。 首先,我们需要了解加密的基本...

    C, C++学习之路之感想.doc

    C++是基于C语言发展而来的,它引入了面向对象编程的概念,使程序设计更加模块化和可复用。C语言主要采用结构化编程思想,适合底层系统编程,对硬件控制能力强;而C++则在C的基础上增加了类、继承、多态和模板等特性...

    Proposed RCU C++ API

    标题“Proposed RCU C++ API”暗示了一个关于RCU(Read-Copy-Update)...通过阅读这份文档,C++开发者可以获得如何在他们的并发应用程序中实现RCU的深入指导,同时学习到并行编程、内存管理和多线程设计中的高级技巧。

    推荐的C++书籍 4.4 STL源码剖析

    并且调侃地说,可以把是否使用其中模板方法定义为,现代C++使用者和非现代C++使用者,并且检讨了自己在早期版本Effective对模板的忽视,最后重申在新版本Effective第七章节加入大量对模板程序设计的段落,作为对这次...

    推荐的C++书籍 4.3 Generic programming and the STL

    并且调侃地说,可以把是否使用其中模板方法定义为,现代C++使用者和非现代C++使用者,并且检讨了自己在早期版本Effective对模板的忽视,最后重申在新版本Effective第七章节加入大量对模板程序设计的段落,作为对这次...

    《深入浅出MFC》读书心得

    《深入浅出MFC》读书心得是 Windows 程序设计的经典读物,本文将对书中的一些重要知识点进行总结和解释。 首先,Windows 程序可以分为两个部分:程序代码和 UI(User Interface)资源。程序代码使用 C++编译器,而...

    缓冲区溢出读后感,一个读书报告

    【缓冲区溢出读后感】 缓冲区溢出是一种常见的软件安全漏洞,主要发生在程序处理数据时,超过了预定的存储空间限制,导致数据溢出到相邻的内存区域。这种现象可能导致程序崩溃,更严重的是,攻击者可以利用缓冲区溢...

    C++编的五子棋源代码

    《C++实现的五子棋游戏源码解析》 五子棋是一种深受人们喜爱的智力游戏,它简单易学但策略复杂,具有很高的娱乐性和挑战性。...对于想要提升C++编程能力或者对游戏开发感兴趣的读者来说,这是一个很好的实践案例。

    mqtt通讯,mqtt通讯协议,C/C++

    MQTT协议基于TCP/IP,设计时考虑了低带宽、高延迟和不可靠网络环境,因此特别适合嵌入式设备。它主要有三个核心概念:发布者(Publisher)、订阅者(Subscriber)和代理(Broker)。发布者发布消息到特定主题(Topic...

    《编程高手箴言》的读后感.doc

    6. **编译器与工具**:商业编译器如Visual C++与开源的GCC(GNU Compiler Collection)相比,不仅在于界面的差异,更在于生态系统和服务的支持。虽然GCC功能强大且跨平台,但想要实现商业化,还需要包括用户界面、...

    高质量C/C++编程

    《高质量C/C++编程》是林锐博士撰写的一份详细指南,旨在提供关于如何编写高效、可靠且易于维护的C++和C语言程序的建议。这份文档经过了从草稿到正式版本的审阅过程,确保了内容的严谨性和实用性。 在C++/C编程中,...

    深入浅出MFC读书笔记1

    程序启动后,进入消息循环,由GetMessage函数负责获取消息,然后分发到相应的回调函数进行处理。 书中通过一个简单的Win32程序实例,展示了程序的执行过程,分为两个阶段:应用程序加载阶段和消息循环阶段。WinMain...

    Google C++编程风格指南

    这份指南不仅涵盖了语言的基础用法,还深入到设计模式、错误处理、性能优化等多个方面,是每一位C++程序员应该了解和遵循的规则。 1. **命名规范**:Google C++风格强调清晰、一致的命名规则。类名使用驼峰式命名...

    新手入门C++编程规范介绍

    - 规则1-2:独立的程序块之间和变量声明后应插入空行,提高代码可读性。 - 规则1-3:长语句应拆分为多行,操作符置于新行开头,保持适当缩进,便于阅读。 - 规则1-4:循环和条件语句中的长表达式同样需要拆分,低...

    C++.zip

    在现代的计算机科学教育中,C++语言作为编程语言的精髓之一,一直是计算机专业学生和对编程感兴趣人士的重要学习对象。C++拥有丰富多样的编程范式,从过程化、面向对象到泛型编程,这使得它不仅能够高效地开发出高...

Global site tag (gtag.js) - Google Analytics