虚函数理解

来源:互联网 发布:114啦网址导航源码 编辑:程序博客网 时间:2024/06/13 08:37

 只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。(关于虚拟机制是如何实现的,参见Inside the C++ Object Model ,Addison Wesley 1996)
基类是base,

派生类是derived,在derived中定了一个虚函数 vitual print

则当一个指针指向derived的对象时候,调用print,调用的是derived的而不是print的。 本来就是这样子把

class Base   //基类base,构造函数base
{
public:Base(){}
public:
       virtual void print(){cout<<"Base";}  //虚函数print,打印base
};
 
class Derived:public Base    //base的派生类为derived。这里是继承,public是访问控制限定符
{
public:Derived(){}
public:
       void print(){cout<<"Derived";}  //成员函数 print
};
 
int main()
{
       Base *point=new Derived();   //实例化一个derived的对象,由一个base类的指针指向它
       point->print();     //调用该类的函数print
}

Output:
Derived
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的: