-
如果父类中存在纯虚函数,而子类中并没有实现此函数,则子类便继承了父类中的纯虚函数,成为和父类一样的抽样类,都不可以实例化对象。
查看全部 -
在同时接了多个接口类的子类中,必须把接口类中所有的虚函数进行实现
查看全部 -
常见异常情况
查看全部 -
异常处理关键字:
try...catch..(try是尝试的意思,就是指尝试运行正常的逻辑;catch是捕获的意思,就是在try过程中出现异常,就会捕获异常,进行处理)
throw(就是抛出异常的意思,抛出之后给catch进行捕获)
这个基本思想就是主逻辑和异常处理逻辑进行分离!
查看全部 -
本质上所有的操作系统都是一个死循环,不停的接收以及响应用户的处理和给予反馈
真正的问题在于要分析清楚你所需要的所有资源的生命周期,包括内存的申请和释放,外设的创建和销毁等等。只要是你申请的资源,你必须确认他能够及时正确的得到销毁。
还有一点是既然死循环必须要考虑何时和怎样释放CPU,例如利用信号量等待将当前任务/进程挂起,或者简单的利用wait/sleep之类函数主动释放。异常:程序在运行过程出现错误。
异常处理:对有可能发生异常的地方做出预见性的安排。
异常处理的基本思想:主逻辑与异常处理分离
try与catch是一对多的关系。
多态与异常处理的关系:Exception:HardwareErr,SizeErr,MemoryErr,NetworkErr
查看全部 -
用typeid函数的时候要#include <typeinfo>
查看全部 -
这个地方可以看到typeid(*obj).name() 打印出来的是class Bird进一步说明了typeid(X).name() 是识别X的数据类型,并非识别指针。
查看全部 -
typeid注意事项:
type_id返回一个type_info对象的引用;
如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数;否则我们只能返回定义时所使用的的数据类型。
只能获取对象的实际类型。(只能判断当前对象是基类还是子类,不能识别当前指针是基类还是子类)
查看全部 -
dynamic_cast注意事项:
只能应用与指针和引用的转换
要转换的类型中必须包含虚函数
转换成功返回子类的地址,失败返回NULL
查看全部 -
RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型(通俗话来说,就是能够知道这个基类指针纠结是被哪个派生类在用)
dynamic_cast是将一个基类对象指针(或引用)转换到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理
typeid(*obj).name()来确定派生类指针类型。if(typeid(*obj).name() == typeid(Bird))进行指针比对。Bird *bird = dynamic_cast<Bird *>(obj)进行基类指针向派生类指针的转换。
查看全部 -
当类定义了虚函数之后,就会开拓一块特殊的内存VFtable虚函数表,虚函数表指针指向一个位置,这个位置中又放有各个虚函数实现的内存的指针。
当基类中定义虚函数,子类继承并独特实现了同名虚函数后,虚函数表的指针就发生了变化,之后虚函数表中函数实现位置指针更加不同,就如图中的0xCCFF
查看全部 -
接口类Flyable,没有cpp文件,因为根本不需要去实现。 并且没有构造函数和析构函数,只有2个纯虚函数。
构造函数是用来实例化(或者叫构造对象)用的, 而接口是不允许进行实例化的, 因此没有构造函数
接口类只含有纯虚函数,接口类不能被实例化,但可以有指向接口类的指针,以便于操纵各个子类。
查看全部 -
接口类定义:仅含有纯虚函数的类(没有数据成员,仅有成员函数且均为纯虚函数)
接口类更多的表达一种协议或能力
查看全部 -
Animal ();仅仅是声明,类外要对其进行定义Animal::Animal(){};
而Animal(){};是在类内定义
这个地方Animal的默认构造函数不能只写成Animal();因为这样写只是申明了,没有定义它(之前我们是在Animal.cpp里面定义了的),要定义它必须要加{}!!!(虽然在定义里面我们什么都没做!)
而在实例化对象Dog的时候,我们调用了这个默认的父类构造函数Animal(){} , 所以这里我们不加{}就会报错。
但是在Dog类中,我们对默认构造函数写成Dog(); 程序却能够正常运行,是因为我没虽然没有定义Dog(),但是我们也没调用它。 我们调用的是函参的构造函数Dog(string name){},所以才没有报错。
这个事情告诉我们,在没有多个文件的的时候,声明函数了一定要定义!!
查看全部 -
虚函数一定要有函数体:比如
virtial void eat(){cout << "Animal--" << m_strName << "-- eat" << endl;}
如果没有后面的函数体,只写成:virtial void eat();计算机会认为这是一个纯虚函数,但是会报错,因为纯虚函数后面要写=0。
查看全部
举报