`
izuoyan
  • 浏览: 8952561 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

函数的重写

 
阅读更多

我在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

    函数重写.rar

    SafePHP重写一组核心PHP函数以抛出异常而不是在遇到错误时返回false

    Safe PHP:重写一组核心PHP函数以抛出异常,而不是在遇到错误时返回false

    重写重载构造函数

    重写重载构造函数 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同

    C++中重载与重写函数区别及虚函数

    C++中重载与重写函数区别及虚函数!

    BMP文件处理类

    备 注:如果不是上述环境,请将DrawBMP函数重写;而且由于各个版本问题,添加必要的头文件~ 贴一个挫挫的类,献给正在学BMP文件格式的同学 使用范围:24位BMP位图(无调色板); 如何增加使用范围:改写GetPixel...

    重写oracle wm_contact函数

    重写oracle wm_contact 函数

    STM32F407 modbus主机代码

    2.修改发送接口 重写 ModbusMasterStartSendBufferFun 函数 发送数据填充到 ModbusMasterDealType.Send.Buffer 并把数组中的数据发出 3.修改发送接收数据长度 在ModbusMaster.h 中 MasterModbusSENDBUFF_SIZE ...

    C#25个问题 静态成员和非静态成员的区别等等

    1.静态成员和非静态成员的区别?...11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?

    重写QCustomplot库的reSize函数

    重写QCustomplot库的reSize函数,由于原函数在resize后会初始化data导致先前数据丢失。 为了适应瀑布图需要,所以重写了该函数void QCPColorMapData::setSize2(int keySize, int valueSize);

    C++easyX实现飞机大战(1500+行代码 课程设计+毕业设计)

    3. 游戏逻辑清晰易懂,虚函数重写,使得代码清晰,逻辑清晰。 4. 注释详细,每一个类和函数都至少有一行注释来说明功能及含义。 5. 融合STL容器,使用功能多样。 可扩充性: 如果你想要添加其他的功能,可以《照...

    python面向对象day04.txt

    函数重写 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...

    基于C++开发的植物大战僵尸【100013171】

    随着植物和僵尸种类的增加,考虑用继承实现代码复用,所有植物公用一个基类,所有僵尸以普通僵 尸为基类,利用虚函数重写每种植物和僵尸的特殊的功能。 利用STL中的容器储存每个地块中的植物、僵尸以及子弹,方便...

    MFC 3D PreTranslateMessage 0.1.

    MFC 3D PreTranslateMessage 0.1.

    C#基础概念.doc

    11、可以使用抽象函数重写基类中的虚函数吗? 12、密封类可以有虚函数吗? 13、如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢? 14、...

    常见 ASP.NET 概念(开源,说明)

    11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢? 14.abstract ...

    c#基础学习问答c#基础学习问答

    11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢? 14.abstract ...

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗? 面试官问我,为什么重写equals函数,必须重写hashCode函数,我当时就懵住了。 然后扯天扯地,然后面试官瞬间就饱了,痛定思痛,写下这篇博客 首先看...

    C#基础概念二十五问

    11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的...

    C#的25个问题(内附代码示例)

    11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的...

    java最新基础笔试题-dexter:用于将C++中的图像处理函数重写为Halide的编译器

    java最新基础笔试题Dexter:将 C++ 代码提升到 Halide 的编译器 Dexter 是一个概念验证编译器原型,旨在通过将旧图像和数组处理 C++ 代码重新编写到 . 给定一个用 ...Lifting(程序综合和验证的组合)来发现隐藏在低级...

Global site tag (gtag.js) - Google Analytics