C++虚函数解析

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

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()不是被宣告为虚函数时,输出如下所示:

1

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.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值