-
如果在父类和子类出现同名函数,没有定义为虚函数时,这个函数在虚函数表中的入口地址是相同的父类虚函数表中的地址,而定义了虚函数,子类虚函数表就会出现一个函数地址覆盖掉父类的地址,此时访问的就是子类中的函数
查看全部 -
而实例化子类时,子类也会通过继承父类的虚函数表为自己的虚函数表,虚函数指针不相同,但是虚函数的入口地址一样,此时就能调用父类的虚函数,如果子类定义了与自己父类同名的虚函数,此时这个虚函数的入口地址就与父类的不同
查看全部 -
有虚函数父类指针生成时会同时生成一个指向虚函数表的虚函数表指针,而虚函数变中有各个虚函数的入口,父类指针就可以通过虚函数表指针找到虚函数表,再通过虚函数表找到虚函数
查看全部 -
虚拟函数的局限:1.虚函数只能描述成员函数,不能定义普通函数
2.不能修饰静态的成员函数
3.内联函数不能是虚函数
4.构造函数不能是虚函数
查看全部 -
借用父类指针去销毁子类对象时,只会执行父类的析构函数,此时子类的析构函数执行不了,如果子类构造函数有申请动态内存,子类定义的数据成员无法释放,就产生了内存泄漏,解决的方法就是定义子类的析构函数为virtual析构函数(虚析构函数)
查看全部 -
在父类和子类中把想要实现多态的函数前面加virtual,声明为虚函数
查看全部 -
多态分为静态多态(早绑定)、动态多态(晚绑定)
1、静态多态(早绑定):程序在编译的时候,就已经根据参数的不同确定了对应的函数,即函数重载,同名函数提前设置好了不同参数进行传入
2、动态多态(晚绑定):必须以封装和继承为基础
达到对不同的对象下达相同指令另其做不同处理的目的
解决方式:用virtual关键字修饰要下达指令的函数,使其成为虚函数
查看全部 -
虚函数表
1.多态的核心
2.C++中实现多态的关键所在
查看全部 -
纯虚函数与抽象类和接口类的关系
查看全部 -
面向对象三大特征
查看全部 -
dynamic_cast<class *>pointer
查看全部 -
// 通过父类对象实例化狗类
Animal *p=new Dog();
是用父类指针指向子类对象,不是“使用父类对象实例化子类”。
查看全部 -
1、在类实例化的对象当中,他的数据成员所占据的内存大小(数据成员,不包括成员函数),即为对象的大小
2、对象的地址,通过一个类实例化了一个对象,那么这个对象在内存当中会占有一定的内存单元,这个内存单元的第一个内存单元的地址也就是这个对象的地址
3、对象成员的地址,当用一个了类去实例化一个对象之后,这个对象可能有一个或者多个数据成员,每一个数据成员所占据的地址,那么就是这个对象成员的地址
对象的每一个数据成员因为数据类型不同,所以占据的内存大小也有不同,所以地址也是不同的
4、虚函数表指针指的是在具有虚函数的情况下,实例化一个对象的时候,这个对象的第一块内存当中所存储的是一个指针,那么这个指着就是虚函数表指针。因为他也是一个指针,所以他的占据内存大小也应该是4.
5、int *p=(int *)&shape; 定义p指向shape这个对象。(将shape类型的地址转化为int类型地址)
查看全部 -
父类和子类出现了同名函数就称之为函数的隐藏
函数指针与普通指针本质上是一样的,也是由4个基本的内存单元组成,存储1个内存地址,这个内存地址就是指向函数的首地址
查看全部 -
virual的使用限制
1、普通函数不能是虚函数
2、静态成员函数不能是虚函数
3、内联函数不能是虚函数
4、构造函数不能是虚函数
查看全部
举报