-
typeid的注意事项查看全部
-
dynamic_cast<class *>(obj) 注意事项查看全部
-
RTTI:运行时类型检测。用到typeid 和 dynamic_cast. typeid时获取当前指针的类型,而dynamic_cast是转换指针类型查看全部
-
当子类继承A类,和B类,可以A类不是接口类,B类是接口类。可以理解为,子类继承A类的大部分数据成员和成员函数,而在函数中重新用virtual定义从B类继承来的纯虚函数。子类继承A类的时候,如果用父类指针指向子类,那么在调用时,指针只能调用父类的数据成员和函数。但是如果有虚函数,那么就会产生隐藏和覆盖,换句话说此时调用的成员函数如果是和子类重名,调用的是子类的虚函数。父类指针指向子类的对象的时候,构造函数会先执行父类的,再执行子类的,而析构函数只是执行父类的(前提是析构函数不是虚函数,否则会先执行子类的析构函数再执行父类的析构函数)。所以如果在普通函数中定义的参数是父类指针类型的时候,如果传入的是子类(父类中定义虚函数),那么你传入不同的子类,代码上父类执行相同的函数但是结果不相同,就实现了多态。如果你定义的参数是子类指针类型,传入的子类指针地址,那么根据继承,你可以调用父类中数据成员和方法。具体的原理就是虚函数表,虚函数指针和一些基本规则查看全部
-
仅含有纯虚函数的类定义为接口类查看全部
-
注意函数不能只声明不定义,所以在没有cpp文件时,定义构造函数的时候:Animal(){};查看全部
-
含有纯虚函数的类叫做抽象类,其虚函数表指针指向的是纯虚函数的指针,值就是零查看全部
-
纯虚函数的定义查看全部
-
两张虚函数表中的函数指针可能指向同一个函数。查看全部
-
对于一个数据成员都没有的类,c++会使用一个内存单元来标明该类的存在。如果有数据成员的话就不需要占据一个内存了。查看全部
-
对象的大小:类实例化对象的时候,其数据成员不包括成员函数所占的内存大小。 对象的地址:类实例化对象的时候,在内存该对象会占据一定的空间,其对象所占据内存的首地址就是对象的地址 对象成员的地址:顾名思义,类实例化对象后,其类中数据成员所占据内存的首地址。 虚函数表指针:当类中有定义虚函数时,当类实例化对象后,会在对象所占内存的顶端生成虚函数表指针,占据四个内存,来指向虚函数的入口地址。查看全部
-
当用父类的指针去指向子类对象时,会拿到子类的虚函数表指针,然后找到虚函数表,通过虚函数表指针的偏移,找到要调用的虚函数的函数指针,从而实现函数的调用。注意这里的偏移必须是和父类的偏移量是一样的。 与本节内容有关,补充两个概念:函数的隐藏和覆盖 函数的隐藏:没有定义多态的情况下,即没有加virtual的前提下,如果定义了父类和子类,父类和子类出现了同名的 函数,就称子类的函数把同名的父类的函数给隐藏了。 函数的覆盖:是针对多态来说的。如果定义了父类和子类,父类中定义了公共的虚函数,如果此时子类中没有定义同 名的虚函数,那么在子类的虚函数表中将会写上父类的该虚函数的函数入口地址,如果在子类中定义了 同名虚函数的话,那么在子类的虚函数表中将会把原来的父类的虚函数地址覆盖掉,覆盖成子类的虚函 数的函数地址,这种情况就称为函数的覆盖。查看全部
-
执行完子类的析构函数,就会执行父类的析构函数。当我们通过父类的指针来指向子类的对象,销毁父类指针时,会首先根据虚函数表指针找到子类的虚析构函数地址执行子类析构函数,当执行完子类的析构函数后会自动执行父类的析构函数,从而达到目的。查看全部
-
如果在子类中定义中有父类的虚同名函数,那么子类的虚函数表中的虚函数指针不再指向父类的虚函数,而是指向子类自己的虚函数的入口地址,所以原来子类虚函数表中的虚函数地址被“覆盖”掉了。查看全部
-
当定义一个子类的时候,如果子类没有同名的虚函数,是直接继承父类的虚函数,那么实例化子类的时候,也会产生虚函数表指针,指向的是子类的虚函数表,但是在子类的虚函数表中,虚函数指针指向的仍然是父类的虚函数入口地址,和父类的虚函数入口地址是一样的查看全部
举报
0/150
提交
取消