-
构造函数和析构函授都没有
查看全部 -
重载、覆盖、隐藏的区别
成员函数被重载的特征:
相同的范围(在同一个类中)
函数名字相同
参数不同
virtual关键字可有可无
覆盖是指派生类函数覆盖基类函数,特征是:
不同范围(分别位于派生类与基类)
函数名字相同
参数相同
基类函数必须有virtual关键字
隐藏是指派生类的函数屏蔽了与其同名的基类函数
如果派生类的函数与基类函数同名,但是参数不同。此时不论有无virtual关键字,基类的函数将被隐藏(勿与重载混淆)
如果派生类的函数与基类函数同名,并且参数相同。但是基类没有virtual关键字,基类的函数将被隐藏(勿与覆盖混淆)
查看全部 -
以下来自他人的回答,非常不错哦~
先说个函数指针的概念,每个类(除了空类,就是没有方法也没有属性的类)在创建的时候,就会生成一个虚函数表指针,这个指针与普通的指针一样,存的是函数的入口地址,这是在类生成的时候就建立的。下来说几种情况:
父类实现了非virtual修饰的方法一,子类继承父类,子类没有再实现方法一,这样父类与子类的关于方法一在各自虚函数表中的地址是一样的,也就是子类可以直接用父类的方法,而不用再去实现;
父类实现了非virtual修饰的方法一,子类继承父类,子类重写了方法一,这样子类的虚函数表的方法一的地址与父类的虚函数表的方法一的地址是不同的。这时候父类指针指向子类对象的时候,调用方法一时会用父类虚函数表中方法一的入口,这样执行的就是父类方法一的实现;而子类调用方法一时,使用的是子类虚函数表中的方法一的入口,这样执行的就是子类方法一的实现。这种情况叫隐藏。
父类实现了virtual修饰的方法一,子类继承父类,子类没有再实现方法一,这样父类与子类的关于方法一在各自虚函数表中的地址是一样的,也就是子类可以直接用父类的方法,也不用再去实现;
父类实现了virtual修饰的方法一,子类继承父类,子类重写了方法一,这样子类的虚函数表的方法一的地址与父类的虚函数表中方法一的入口地址也是不同的。与第二种情况不同的是,采用virtual修饰的方法,在父类指针指向子类对象时,子类的同名方法会覆盖父类的方法的入口,也就是父类的虚函数表方法一的入口地址会被子类的虚函数表的方法一的入口覆盖,这时候父类指针执行的就是子类的方法一的实现,从而实现多态。这种情况叫覆盖。
下来说 父类 * p = new 子类; 这样的操作之后到底执行哪块代码,就得分具体情况了,但是在面向对象的编程中,多态是一个很重要的特性,所以一般建议大家对有继承关系的类加上virtual修饰。
举个例子,人都需要吃饭,而小明每次吃饭都哵嗒嘴,也就是:人 *人1 = new 小明(); 到吃饭的时候,调用人1的吃饭的方法,因为这个人是小明,所以就要有小明吃饭的特征。如果没有virtual关键字,那人人吃饭都一个样了,好无聊哦。
查看全部 -
抽象类:含有纯虚函数的类叫做抽象类。
查看全部 -
try catch throw
查看全部 -
异常处理的定义
查看全部 -
typeid注意事项
查看全部 -
dynamic_cast注意事项
查看全部 -
运行时类型识别的写法
查看全部 -
接口类的定义
查看全部 -
抽象类的定义
查看全部 -
纯虚函数和虚函数对比
查看全部 -
理论前提。
查看全部 -
虚析构函数
查看全部 -
虚函数的书写方式
查看全部
举报