1、虚函数是c++一个重要特性多态的表现形式(函数重载、运算符重载、模板、虚函数)-》多态的表现形式
2、虚函数的定义:
virtual 函数类型 函数名称(参数列表);
如果一个函数在基类中被声明为虚函数,则他在所有派生类中都是虚函数
注意点:(1)只有通过基类指针或引用调用虚函数才能引发动态绑定
(2)虚函数不能声明为静态
虚函数的动态绑定:
(1)虚函数的动态绑定是通过虚表来实现的。
(2)包含虚函数的类头4个字节存放指向虚表的指针
举例如下:
#include<iostream>
using namespace std;
class Base
{
public:
virtual void Fun1()
{
cout<<"Base::Fun1............."<<endl;
}
virtual void Fun2()
{
cout<<"Base::Fun2............."<<endl;
}
void Fun3()
{
cout<<"Base::Fun3............"<<endl;
}
Base()
{
cout<<"Base::Base().........."<<endl;
}
//如果一个类要作为多态基类,要把析构函数定义为虚函数
virtual ~Base()
{
cout<<"Base::~Base..........."<<endl;
}
};
class DD:public Base
{
public:
/*virtual */void Fun1()
{
cout<<"DD::Fun1............."<<endl;
}
/*virtual */void Fun2()
{
cout<<"DD::Fun2............."<<endl;
}
void Fun3()
{
cout<<"DD::Fun3............"<<endl;
}
DD()
{
cout<<"DD:: DD()..........."<<endl;
}
~DD()
{
cout<<"DD:: ~DD()........."<<endl;
}
};
int main()
{
/*Base *p;
DD dd;
p=ⅆ
p->Fun1(); //Fun1为虚函数,基类指针指向派生类对象,调用的是派生类对象的虚函数
p->Fun2();
p->Fun3();//Fun3为非虚函数,调用的是类本身的函数。
*/
Base *p;
p=new DD();
p->Fun1();
delete p;
return 0;
}
///
如果你打算允许其他人通过基类指针调用对象的析构函数(通过delete这样做是正常的),
并且被析构的对象是有重要的析构函数的派生类的对象,就需要让基类的析构函数作为虚函数。