假设Base基类,myDrive继承了Base。虚函数实习多态主要是为了用基类,来调用子类的函数。当然你不可能使用这样的定义Base* B=new Base()去调用它的myDrive中的函数,要这样那就太假了。要调用子类中的函数,必须这样定义
Base* B=new myDrive();这样定义才可能调用子类中的函数。下面看以个简单的例子:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
}
virtual void f()
{
cout<<"virtual fun f in base"<<endl;
}
void f2()
{
cout<<"fun f2 in base"<<endl;
}
virtual ~Base()
{
cout<<"Base des"<<endl;
}
};
class myDrive:public Base
{
public:
myDrive()
{
}
void f()
{
cout<<"fun f in myDrive"<<endl;
}
void f2()
{
cout<<"fun f2 in mydrive"<<endl;
}
~myDrive()
{
cout<<"myDrive des"<<endl;
}
};
int main()
{
Base* m=new myDrive();
m->f();
m->Base::f();
m->f2();
delete m;
}
输出结果如下:
fun f in myDrive
virtual fun f in base
fun f2 in base
myDrive des
Base des
仔细看上面的程序,我们还可以发现以下两点:
1、对于虚函数我们可以用m->Base::f();来掉用基类函数
2、析构函数定义为虚函数后,子类跟父类分别调用了,这样我们才能保证析构是内存完全释放。在上述代码中,如果把Base不定义为虚函数运行的话你会发现子类的析构函数没有执行,这样就会造成内存泄漏,所以析构函数一般都定义为虚函数。