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中虚函数_虚函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用计算机学数学日记,【实用】数学日记范文
- 下一篇: 管理鸡汤之管理定律分类解读