什么是虚方法
2014-05-30 17:11
134 查看
虚方法使用起来比较简单,但很难理解,对一个没有听过说虚方法的人用概念很难向他解释清楚,那么下面小雨用一个例子让大家明白到底什么是虚方法。
为了不让大家眼花,我就不在这么写代码了,用文字描述,假设我们的程序中有一个父类Animal,两个子类Bird和Pig,父类中有一个move()方法,那么子类Bird和Pig也继承了move()方法,但是猪和鸟的移动方式不同,所以在子类中对move()方法进行了覆盖,然后我们在主函数中以指针变量的形式创建两个对象,即Animal *pig=new Pig();Animal *bird=new Bird();然后调用对象的move方法,即pig->move();
bird->move();但是问题就出来了,观察程序结果我们会发现两个指针变量调用的都是父类中move()方法,而不是子类的。
这是为什么呢,原因是C++追求和C一样的效率,在程序编译时,编译器就会认为两个指针变量都是Animal类型,那自然会调用Animal的move()方法,而new操作是在运行时才为pig和bird分配Pig类型和Bird类型,所以程序结果会和我们预期不一致,为此引入了虚方法。
将move方法声明为虚方法就会避免此种问题,操作很简单,即在方法前加上一个vtrual修饰,即virtual void move();这样就可以了。现在大家对虚方法的理解是不是清晰多了呢,简言之虚方法的目的就是让编译器知道两个指针的类型。
为了不让大家眼花,我就不在这么写代码了,用文字描述,假设我们的程序中有一个父类Animal,两个子类Bird和Pig,父类中有一个move()方法,那么子类Bird和Pig也继承了move()方法,但是猪和鸟的移动方式不同,所以在子类中对move()方法进行了覆盖,然后我们在主函数中以指针变量的形式创建两个对象,即Animal *pig=new Pig();Animal *bird=new Bird();然后调用对象的move方法,即pig->move();
bird->move();但是问题就出来了,观察程序结果我们会发现两个指针变量调用的都是父类中move()方法,而不是子类的。
这是为什么呢,原因是C++追求和C一样的效率,在程序编译时,编译器就会认为两个指针变量都是Animal类型,那自然会调用Animal的move()方法,而new操作是在运行时才为pig和bird分配Pig类型和Bird类型,所以程序结果会和我们预期不一致,为此引入了虚方法。
将move方法声明为虚方法就会避免此种问题,操作很简单,即在方法前加上一个vtrual修饰,即virtual void move();这样就可以了。现在大家对虚方法的理解是不是清晰多了呢,简言之虚方法的目的就是让编译器知道两个指针的类型。
相关文章推荐
- 有没有什么方法可以让IFRAME的高度随着里面的内容增加而自动增高
- 真正的程序设计方法是什么?
- 手机游戏里用什么方法寻路
- Cache类中的Add 和 Insert 方法有什么区别
- 什么是虚方法?
- 有没有什么方法可以调用字符串变量,使其像一般语句一般执行.
- 有没有什么好的方法实现在线升级
- 有什么最快的方法判断一个字符串内都是数字
- 到底调用什么方法呢
- 昨天买了个游戏盘,55¥。玩极品飞车。可是。。谁有什么方法能让我玩的更爽一点啊。我请你喝咖啡了!
- 什么是对象、方法、属性、事件
- oracle密码遗忘,有什么解决方法 ,呵呵
- "=="和equals方法究竟有什么区别?
- 1bu.com用的什么方法?
- Finalize方法应该干什么?
- 什么是最理想的软件保护方法?
- 在Struts中reset方法有什么作用(转)
- [ChneChen的随笔][管理之道]什么才是我们需要的解决问题的方法(从如何限制公司电脑使用U盘解决之道谈起)
- 在Struts中reset方法有什么作用
- CC攻击的原理方法是什么如何保护自身的操作系统