在前面的所有列举的程序中,函数的入口地址与函数名是在编译时进行绑定的,我们称之为编译期绑定,而多态的功能则是将函数名动态绑定到函数入口地址,这样的动态绑定过程称为运行期绑定。编译期绑定是指在程序编译时就将函数名与函数入口地址绑定到一起,运行期绑定是指在程序运行时才将函数名与函数入口地址绑定到一起,而在运行期绑定的函数我们称其是多态的。
#include<iostream>
using namespace std;
class base
{
public:
void display(){cout<<"I'm base class!"<<endl;}
};
class derived: public base
{
public:
void display(){cout<<"I'm derived class!"<<endl;}
};
int main()
{
base * p;
derived test;
p = &test;
p->display();
return 0;
}
此程序最终运行结果如下:
I’m base class!
很显然这个和我们想要的不一样,因为我们指向的test是派生类创建的对象,我们希望它指向派生类的函数。于是,C++提供了多态这一种机制。
要想形成多态必须具备以下三个条件:
- 必须存在继承关系;
- 继承关系中必须有同名的虚函数;
- 存在基类类型的指针或引用,通过该指针或引用调用虚函数。
#include<iostream>
using namespace std;
class base
{
public:
virtual void display(){cout<<"I'm base class!"<<endl;}
};
class derived: public base
{
public:
virtual void display(){cout<<"I'm derived class!"<<endl;}
};
int main()
{
base * p;
derived test;
p = &test;
p->display();
return 0;
}
这段程序最终运行结果如下:
I’m derived class!