C++语言程序设计

| 程序段11-6

class vehicle
{
…
virtual void message(void) {cout << "Vehicle message\n";}
};

class car : public vehicle
{
int passenger_load;
public:
（virtual）void message(void) {cout << "Car message\n";}
};

在这个例子里，我们在成员函数message原型前面加上virtual，使这个函数变为虚函数。在派生类中与基类的虚函数有相同的信号（signature）（即参数个数与类型均相同）的函数也都变为虚函数，不管它的前面有没有加上virtual。之所以这么说是因为下面的情况中，并不是所有覆盖的函数都变成虚函数。

| 程序段11-7

class car : public vehicle
{
int passenger_load;
public:
（virtual）void message(void) {cout << "Car message\n";}
void message(int n) {}
//这个函数会覆盖基类的message函数，但是它不是虚函数
};

还有一个有意思的情况：

| 程序段11-8

class car : public vehicle
{
int passenger_load;
private:
（virtual）void message(void) {cout << "Car message\n";}
};

我们把派生类的虚函数定义为私有，就会出现下面的情况：
car mycar;
vehicle* v=&mycar;
mycar.message() //error
v->message() //right
因为message()是car类的私有成员，所以在类外应该访问不到它，正象"mycar.message()"会出现编译错误一样。但是，如果我们把它定义成虚函数，就可以通过基类指针访问到了。
对于"v->message();"，虽然v是vehicle类型指针，但是，它调用的是虚函数，所以实际上调用的是car类的message()函数。