java中虚函数_虚函数
程序示例
例如,一个基类 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中虚函数_虚函数相关推荐
- java里的进制转换函数_基于Java中进制的转换函数详解
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- Java中的强软弱虚引用《对Java的分析总结三》
<对Java的分析总结>-Java中的强软弱虚引用 强引用 StrongReference 软引用 SoftReference 弱引用 WeakReference 虚引用 PlantomR ...
- c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)
c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...
- C++_虚继承_虚函数_纯虚函数(多继承的二义性,多态)
基本信息 每一个类都有一个虚表,以及虚表指针; 虚表的内容是编译器决定的,虚表中用于存放虚函数的指针, 程序运行时的类型信息等; 每个多态对象都存放着一个指向当前类型的虚表的指针, 该指针在构造函数中 ...
- python虚函数_虚函数和纯虚函数的区别
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...
- java中的强软弱虚_详解Java的四种引用——强软弱虚,颠覆你的认知!
强软弱虚 java中的数据被类型分为了两类,它们分别是基本类型和引用类型.一般我们new出来的对象都属于引用类型的范畴.我们知道java是有垃圾回收机制的一种语言,根据垃圾回收时的策略,java将对于 ...
- java中钩子函数回调函数_钩子函数 和回调函数
标签: http://blog.csdn.net/lipeionline/article/details/6369657 转自 也可以这样,更容易理解:回调函数就好像是一个中断处理函数,系统在符合你 ...
- java中钩子函数回调函数_钩子函数和回调函数
一般认为,钩子函数就是回调函数的一种,其实还是有差异的,差异地方就是:触发的时机不同. 先说钩子函数: 钩子(Hook)概念源于Windows的消息处理机制,通过设置钩子,应用程序对所有消息事件进行拦 ...
- Java中的Random()函数 【转载】
今天在做Java练习的时候注意到了Java里面的一个随机函数--Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中 ...
最新文章
- iOS开发系列--让你的应用“动”起来
- Java这个高级特性,很多人还没用过!
- 教育学专硕考试科目计算机,2017考研:哪些专业的考试科目相同?
- Playmaker Input篇教程之PlayMaker菜单概述
- bzoj 4832 抵制克苏恩
- ArcGIS Engine 编辑介绍
- 数据库MySQL基础---约束、表关系、聚合函数、连接查询、分组查询和子查询
- 毕业论文管理系统——面向对象方法
- 记录学习antd design pro dva的过程,主要记错, 多图预警,如有理解偏差,忘指出,多谢!...
- mysql多表条件查询,mysql实现RBAC权限管理sql语句详解
- 通过Jquery异步获取股票实时数据
- 208个地级市总人口、城市和农村人口、城镇化率面板数据(2010-2019年)
- 2750 心系南方灾区
- namesilo如何使用BTC支付:
- 综测仪 之 IQxel使用方法介绍
- stm32的简易小项目之震动感应灯
- 飞控开发--气压计MS5611
- 2018面试总结(阿里巴巴蚂蚁金服、饿了么、人人车等)
- 智能语音应用开发之DPL2.0高级特性
- PPTP连接时常见拨号错误提示原因及解决办法