程序示例

例如,一个基类 Animal 有一个虚函数 eat。子类 Fish 要实做一个函数 eat(),这个子类 Fish 与子类 Wolf 是完全不同的,但是你可以引用类别 Animal 底下的函数 eat() 定义,而使用子类 Fish 底下函数 eat() 的进程。

C++

以下代码是 C++ 的程序示例。要注意的是,这个示例没有异常处理的代码。尤其是 new 或是 vector::push_back 丢出一个异常时,程序在运行时有可能会出现崩溃或是错误的现象。

类别 Animal 的区块图

# include

# include

using namespace std;

class Animal

{

public:

virtual void eat() const { cout << "I eat like a generic Animal." << endl; }

virtual ~Animal() {}

};

class Wolf : public Animal

{

public:

void eat() const { cout << "I eat like a wolf!" << endl; }

};

class Fish : public Animal

{

public:

void eat() const { cout << "I eat like a fish!" << endl; }

};

class GoldFish : public Fish

{

public:

void eat() const { cout << "I eat like a goldfish!" << endl; }

};

class OtherAnimal : public Animal

{

};

int main()

{

std::vector animals;

animals.push_back( new Animal() );

animals.push_back( new Wolf() );

animals.push_back( new Fish() );

animals.push_back( new GoldFish() );

animals.push_back( new OtherAnimal() );

for( std::vector::const_iterator it = animals.begin();

it != animals.end(); ++it)

{

(*it)->eat();

delete *it;

}

return 0;

}

以下是虚函数 Animal::eat() 的输出:

I eat like a generic Animal.

I eat like a wolf!

I eat like a fish!

I eat like a goldfish!

I eat like a generic Animal.

当 Animal::eat() 不是被宣告为虚函数时,输出如下所示:

I eat like a generic Animal.

I eat like a generic Animal.

I eat like a generic Animal.

I eat like a generic Animal.

I eat like a generic Animal.

Java

在Java语言中, 所有的方法默认都是"虚函数". 只有以关键字 final 标记的方法才是非虚函数. 以下是 Java 中虚方法的一个例子:

import java.util.*;

public class Animal {

public void eat() { System.out.println("I eat like a generic Animal."); }

public static void main(String[] args) {

List animals = new LinkedList();

animals.add(new Animal());

animals.add(new Wolf());

animals.add(new Fish());

animals.add(new OtherAnimal());

for (Animal currentAnimal : animals) {

currentAnimal.eat();

}

}

}

public class Wolf extends Animal {

public void eat() { System.out.println("I eat like a wolf!"); }

}

public class Fish extends Animal {

public void eat() { System.out.println("I eat like a fish!"); }

}

public class OtherAnimal extends Animal {}

输出:

I eat like a generic Animal.

I eat like a wolf!

I eat like a fish!

I eat like a generic Animal.

C#

在 C# 语言中, 对基类中的任何虚方法必须用 virtual 修饰, 而派生类中由基类继承而来的重载方法必须用 override 修饰. 以下是 C# 的一个程序实例:

using System;

using System.Collections.Generic;

namespace ConsoleApplication1

{

public class Animal

{

public virtual void Eat()

{

Console.WriteLine("I eat like a generic Animal.");

}

}

public class Wolf : Animal

{

public override void Eat()

{

Console.WriteLine("I eat like a wolf!");

}

}

public class Fish : Animal

{

public override void Eat()

{

Console.WriteLine("I eat like a fish!");

}

}

public class GoldFish : Fish

{

public override void Eat()

{

Console.WriteLine("I eat like a goldfish!");

}

}

public class OtherAnimal : Animal

{

// Eat() method is not overridden, so the base class method will be used.

}

public class Program

{

public static void Main(string[] args)

{

IList animals = new List();

animals.Add(new Animal());

animals.Add(new Wolf());

animals.Add(new Fish());

animals.Add(new GoldFish());

animals.Add(new OtherAnimal());

foreach (Animal currentAnimal in animals)

{

currentAnimal.Eat();

}

}

}

}

输出:

I eat like a generic Animal.

I eat like a wolf!

I eat like a fish!

I eat like a goldfish!

I eat like a generic Animal.

java中虚函数_虚函数相关推荐

  1. java里的进制转换函数_基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  2. Java中的强软弱虚引用《对Java的分析总结三》

    <对Java的分析总结>-Java中的强软弱虚引用 强引用 StrongReference 软引用 SoftReference 弱引用 WeakReference 虚引用 PlantomR ...

  3. c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)

    c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...

  4. C++_虚继承_虚函数_纯虚函数(多继承的二义性,多态)

    基本信息 每一个类都有一个虚表,以及虚表指针; 虚表的内容是编译器决定的,虚表中用于存放虚函数的指针, 程序运行时的类型信息等; 每个多态对象都存放着一个指向当前类型的虚表的指针, 该指针在构造函数中 ...

  5. python虚函数_虚函数和纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  6. java中的强软弱虚_详解Java的四种引用——强软弱虚,颠覆你的认知!

    强软弱虚 java中的数据被类型分为了两类,它们分别是基本类型和引用类型.一般我们new出来的对象都属于引用类型的范畴.我们知道java是有垃圾回收机制的一种语言,根据垃圾回收时的策略,java将对于 ...

  7. java中钩子函数回调函数_钩子函数 和回调函数

    标签: http://blog.csdn.net/lipeionline/article/details/6369657  转自 也可以这样,更容易理解:回调函数就好像是一个中断处理函数,系统在符合你 ...

  8. java中钩子函数回调函数_钩子函数和回调函数

    一般认为,钩子函数就是回调函数的一种,其实还是有差异的,差异地方就是:触发的时机不同. 先说钩子函数: 钩子(Hook)概念源于Windows的消息处理机制,通过设置钩子,应用程序对所有消息事件进行拦 ...

  9. Java中的Random()函数 【转载】

    今天在做Java练习的时候注意到了Java里面的一个随机函数--Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结:   Java中 ...

最新文章

  1. iOS开发系列--让你的应用“动”起来
  2. Java这个高级特性,很多人还没用过!
  3. 教育学专硕考试科目计算机,2017考研:哪些专业的考试科目相同?
  4. Playmaker Input篇教程之PlayMaker菜单概述
  5. bzoj 4832 抵制克苏恩
  6. ArcGIS Engine 编辑介绍
  7. 数据库MySQL基础---约束、表关系、聚合函数、连接查询、分组查询和子查询
  8. 毕业论文管理系统——面向对象方法
  9. 记录学习antd design pro dva的过程,主要记错, 多图预警,如有理解偏差,忘指出,多谢!...
  10. mysql多表条件查询,mysql实现RBAC权限管理sql语句详解
  11. 通过Jquery异步获取股票实时数据
  12. 208个地级市总人口、城市和农村人口、城镇化率面板数据(2010-2019年)
  13. 2750 心系南方灾区
  14. namesilo如何使用BTC支付:
  15. 综测仪 之 IQxel使用方法介绍
  16. stm32的简易小项目之震动感应灯
  17. 飞控开发--气压计MS5611
  18. 2018面试总结(阿里巴巴蚂蚁金服、饿了么、人人车等)
  19. 智能语音应用开发之DPL2.0高级特性
  20. PPTP连接时常见拨号错误提示原因及解决办法

热门文章

  1. 一种以STC89C51为核心控制器的积水清除与利用装置解决方案
  2. chatgpt的一些思考
  3. ERP系统-应收应付子系统-应收/应付账单
  4. docker-compose环境变量
  5. UML类图中类与类之间的关系
  6. 关闭系统还原清理垃圾文件
  7. 网站下拉菜单,选择下拉后自动填充(图)
  8. seo vue 动态路由_基于Vue SEO的四种方案
  9. 【学习笔记·1】无刷直流电机基础
  10. 芯片破壁者(三):光刻技术的“鬼斧”之变