虚函数有时候也被称为方法。它可以使有差异的实体对象公用一种方法实现不同的操作。
虚函数能克服类型域解决方案中的缺陷,它使程序员能够在基类声明一些能够在各个派生类里面重新定义的函数。编译器和装载程序能保证对象和应用于他们的函数之间的正确对应关系。
class Employee
{
string name;
public:
Employee(const string &name);
virtual void print() const;
}
void Employee::print() const
{
cout<<name<endl;
}
关键字virtual指明print的作用就像是一个界面,既可以服务本类print函数,又可以服务于派生类的print函数。对于派生类定义的print函数,编译器保证对于生成的每一个实体对象都能调用正确的print函数。
在派生类中对于有关函数的参数类型必须于虚函数的的参数类型相同,但可以在返回值类型上不同。
所谓的多态性就是从Employee中取得了正确的行为,而不依赖于实际使用的是哪一种Employee。一个带有虚函数的类型被称为是一个多态类型。在C++要取得多态行为,被调用的函数必须是虚函数,而对象必须是通过指针或者引用操作。如果直接操作一个对象(而不是通过指针或者引用),它的确切类型已经被编译器所知,就不需要多态了。
为了实现多态性,编译器必须在类的每个对象里存储某种类型信息,并且在需要虚函数的时候利用这些信息。在典型的实例中,所需要的空间是一个指针。只有那些包含了虚函数的类才需要这点空间,而不是任何对象,甚至不是任何派生类的对象。使用时,只需要为含有虚函数的类付出开销。