例1:
#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;
}
这个例子非常简单,两个类,一个是base类,一个是derived类,二者构成继承关系,同时在这两个类中均含有一个display函数,因为函数同名,故在派生类对象中会出现遮蔽现象,即派生类中的display函数会遮蔽基类中的display函数。
在主函数中,定义了一个基类类型的指针p和派生类对象test,之后p指针指向派生类对象test,然后通过指针调用display函数。此程序最终运行结果如下:
I’m base class!
从结果来看这个程序最终调用的display函数是基类的display函数,而非派生类中的display函数。但此程序的本意是先通过基类类型的指针根据所指向对象的类型来自动决定调用基类还是派生类的display函数。为了实现这样的一种功能,C++提供了多态这一机制。
要想形成多态必须具备以下三个条件:
必须存在继承关系;
继承关系中必须有同名的虚函数;
存在基类类型的指针或引用,通过该指针或引用调用虚函数。
根据这三个条件,我们将例1进行修改,使display函数具有多态特性。修改后程序如例2 所示。
#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;
}
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。