资源描述
3
多态性 张孝国
什么是虚函数
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,就是实现多态性(Polymorphism)。多态性是指为一个函数名称关联多种含义的能力,它通过一种名为“晚期绑定”的特殊机制,为一个函数名称关联多个含义,在程序运行时确定一个函数名称的具体含义。例如:
class A
{
public:
void print()
{
cout<<”This is A”<<endl;
}
};
class B:public A
{
public:
void print()
{
cout<<”This is B”<<endl;
}
};
int main() //为了在以后便于区分,这段main()代码叫做main1
{
A a;
B b;
a.print();
b.print();
return 0;
}
运行,结果分别是:This is A和This is B。class A和class B的print()这个接口,因两个class个体的差异而采用了不同的策略。但这是否是多态性呢?
No,这种情况我们称为函数的重定义。多态有个关键之处就是:用基类类型的指针来操作它指向的对象时,会根据对象的不同类型,调用其相应类的函数。现在把main()处的代码改为:
int main() //main2
{
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
return 0;
}
运行,结果是两个:This is A。
p2明明指向的是class B的对象,但调用的却是class A的print()函数,这不是我们所期望的结果,这主要是因为在编译时,编译器是按照p1和p2的类型来关联函数的。
解决这个问题需要使用虚函数,将一个函数设置成virtual函数,相当于告诉编译器:“目前不知道这个函数如何实现,等它在程序中使用时(即运行时),再从对象实例中获得它的实现。
class A
{
public:
virtual void print() //现在成了虚函数了
{
cout<<”This is A”<<endl;
}
};
class B:public A
{
public:
void print() //这里一般要在函数前面加上关键字virtual。
{
cout<<”This is B”<<endl;
}
};
我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。但做为一种良好的编程风格,最好在派生类的相应函数前加上virtual关键字。
运行,结果是:This is A和This is B。
总结:用基类类型的指针来操作它指向的对象时,会根据对象的不同类型,调用其相应类的函数这个函数就是虚函数。
展开阅读全文