红尘多梦

导航

虚函数简介

一、虚函数

  C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:

 

class A
{
public:
virtual void func() { cout << "A::func() is called" << endl;}
};

class B: public A
{
public:
virtual void func() { cout << "B::func() is called" << endl;}
};

 那么,在使用的时候,我们可以:

A * a = new B();
a->func(); // 在这里,a虽然是指向A的指针,但是被调用的函数(func)却是B的!

一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。

二、多态

  了解了虚函数,那么多态又是什么呢?

   一个动物的基类,基类有speak()这个虚函数,猫和狗都继承了动物这个类,动物speak()这个动作产生的效果就不一样了,如果基类指向的是够,狗的叫声就是“旺旺“,而猫的叫声是”喵喵“。这样同一个动作产生不同的效果的特点,就叫做”多态“。

  多态可以抽象类的”接口“,将实现与声明解耦,在需要派生类的时候写针对派生类的实现。

  多态的实现,依赖虚函数表的机制,编译器在一个类中发现被声明为virtual的函数时,就会将其放入虚函数表中,虚函数表是一个函数数组,在调研虚函数时,根据虚函数表中的函数指针调用具体的实现。

三、虚函数的使用技巧

   1)基类的析构函数要定位为虚函数。

      在delete一个指向派生类的基类指针时,如果基类析构函数不是虚函数,将不会调用派生类的析构函数,容易造成内存泄露。

   2) 虚构造函数

      构造函数不能为虚函数!!

   3)虚函数呗private修饰

      一样可以产生多态效果,语意为:你最好override我的这个函数,但是你不要管它如何使用,也不要自己调用这个函数。

   4)构造函数与析构函数中的调用的虚函数

      在构造函数与析构函数中调用虚函数,它们将变成一个普通函数,

   5)基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字

   6)虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)

   7)在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。

 

posted on 2015-07-19 09:59  红尘多梦  阅读(283)  评论(0编辑  收藏  举报