在C++中,在基类的成员函数声明前加上关键字virtual即可让该函数成为虚函数,派生类中对此函数的不同实现都会继承这一修饰符,允许后续派生类覆盖,达到迟绑定的效果。即便是基类中的成员函数调用虚函数,也会调用到派生类中的版本
例如,一个基类Animal有一个虚函数eat。子类Fish要实做一个函数eat(),这个子类Fish与子类Wolf是完全不同的,但是你可以引用类别 Animal 底下的函数eat()定义,而使用子类Fish底下函数eat()的进程。
C++
以下代码是 C++ 的程序示例。要注意的是,这个示例没有异常处理的代码。尤其是new或是vector::push_back丢出一个异常时,程序在运行时有可能会出现崩溃或是错误的现象。
#include <iostream>
#include <vector>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<Animal*> 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<Animal*>::const_iterator it = animals.begin(); it != animals.end(); ++it) { (*it)->eat(); delete *it; } return 0;}
以下是虚函数Animal::eat()的输出:
1 |
|
当Animal::eat()不是被宣告为虚函数时,输出如下所示:
1 |
|