我在OOP方面的知识一直都使用后再看理论的,因为之前的理论大多都没有吸收,也缺乏深入理解。最近又重新学习了继承体系中关于类中方法的重写(override)。先通过在C++下的例子来阐述这一机制。
在上例中,函数display()不加virtual只是普通的成员函数,那么即使在Man继承People后重写了display(),那么在主函数中父类指针p指向子类对象,并调用其函数display(),并没有执行子类对象的display()函数,而是执行了基类的方法。而在基类People中display()函数前加上virtual后,程序则调用了子类的display()方法。
这就是虚函数在动态绑定中的作用。一个基类指针指向他的任何子类对象,都能够非常智慧的执行子类的方法,而不会被父类的方法所覆盖。这种需求在OOP中是非常普遍的。几乎每个程序员每天都在用吧。
疑问一:很多人都会问,在基类中不加virtual,子类依旧可以重写,而且编译没错,程序也能执行啊?
回答:那是你没读上面那个程序,如果不加virtual,子类方法肯定就被父类方法覆盖了,除非你专门弄一个对子类对象的直接引用。
疑问二:java程序员又会说,java中子类就可以任意重写父类实现著名的父类引用指向子类对象,调用子类方法,实现动态绑定。还不用什么virtual关键字?
回答:那还是你对java语言不熟悉,java中对应的关键字是"@override",呵呵,现在知道"@override"的作用了吧,以前一直都不管那个关键字。你试着将"@override"去掉看看,父类方法必然覆盖掉子类方法,也就是父类引用只能掉父类的方法,即使他指向子类对象。
疑问三:override是重写,那么overload是什么?两者有关系么?很多人容易混?
回答:override是子类重写父类的方法实现动态绑定。是继承体系中纵向的,而overload是函数重载,横向的,类体内部的。没什么关系。但都是多态的体现!
分享到:
相关推荐
函数重写.rar
Safe PHP:重写一组核心PHP函数以抛出异常,而不是在遇到错误时返回false
重写重载构造函数 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同
C++中重载与重写函数区别及虚函数!
备 注:如果不是上述环境,请将DrawBMP函数重写;而且由于各个版本问题,添加必要的头文件~ 贴一个挫挫的类,献给正在学BMP文件格式的同学 使用范围:24位BMP位图(无调色板); 如何增加使用范围:改写GetPixel...
重写oracle wm_contact 函数
2.修改发送接口 重写 ModbusMasterStartSendBufferFun 函数 发送数据填充到 ModbusMasterDealType.Send.Buffer 并把数组中的数据发出 3.修改发送接收数据长度 在ModbusMaster.h 中 MasterModbusSENDBUFF_SIZE ...
1.静态成员和非静态成员的区别?...11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
重写QCustomplot库的reSize函数,由于原函数在resize后会初始化data导致先前数据丢失。 为了适应瀑布图需要,所以重写了该函数void QCPColorMapData::setSize2(int keySize, int valueSize);
3. 游戏逻辑清晰易懂,虚函数重写,使得代码清晰,逻辑清晰。 4. 注释详细,每一个类和函数都至少有一行注释来说明功能及含义。 5. 融合STL容器,使用功能多样。 可扩充性: 如果你想要添加其他的功能,可以《照...
函数重写 repr(obj) str(obj) int(obj) complex(obj) bool(obj) float(obj) len(obj) abs(obj) ... iter(obj) next(obj) 迭代器和可迭代对象: def myyield(): yield 2 yield 3 yield 5 day04...
随着植物和僵尸种类的增加,考虑用继承实现代码复用,所有植物公用一个基类,所有僵尸以普通僵 尸为基类,利用虚函数重写每种植物和僵尸的特殊的功能。 利用STL中的容器储存每个地块中的植物、僵尸以及子弹,方便...
MFC 3D PreTranslateMessage 0.1.
11、可以使用抽象函数重写基类中的虚函数吗? 12、密封类可以有虚函数吗? 13、如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢? 14、...
11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢? 14.abstract ...
11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢? 14.abstract ...
面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗? 面试官问我,为什么重写equals函数,必须重写hashCode函数,我当时就懵住了。 然后扯天扯地,然后面试官瞬间就饱了,痛定思痛,写下这篇博客 首先看...
11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的...
11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的...
java最新基础笔试题Dexter:将 C++ 代码提升到 Halide 的编译器 Dexter 是一个概念验证编译器原型,旨在通过将旧图像和数组处理 C++ 代码重新编写到 . 给定一个用 ...Lifting(程序综合和验证的组合)来发现隐藏在低级...