标签:
一、虚函数
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)也不一样。
标签:
原文地址:http://www.cnblogs.com/hervey/p/4658216.html