C++语言程序设计

针对教材中举出的例子，我们看一下编译器的编译过程：

| 例11-18

#include <iostream.h>
//如果定义了vehicle类的对象，编译器为该对象分配8个字节的存储空间
class vehicle
{
int wheels; //占用4个字节
float weight; //占用4个字节
public:
void message(void) {cout << "Vehicle message\n";}
//该函数不在类中分配空间，编译器另外分配空间给该函数，并把函数首
//地址记录到一个标识符表中
};
//如果定义了car类的对象，编译器为该对象分配12个字节的存储空间
class car : public vehicle //基类占用8个字节
{
int passenger_load; //占用4个字节
public:
void message(void) {cout << "Car message\n";}
//该函数不在类中分配空间，编译器另外分配空间给该函数，并把函数首
//地址记录到标识符表中
};
//如果定义了truck类的对象，编译器为该对象分配16个字节的存储空间
class truck : public vehicle //基类占用8个字节
{
int passenger_load; //占用4个字节
float payload; //占用4个字节
public:
int passengers(void) {return passenger_load;}
//该函数不在类中分配空间，编译器另外分配空间给该函数，并把函数首
//地址记录到标识符表中
};
//如果定义了boat类的对象，编译器为该对象分配12个字节的存储空间
class boat : public vehicle //基类占用8个字节
{
int passenger_load; //占用4个字节
public:
int passengers(void) {return passenger_load;}
void message(void) {cout << "Boat message\n";}
//这两个函数都不在类中分配空间，编译器另外分配空间给该函数，并把
//函数首地址记录到标识符表中
};
void main()
{
vehicle *unicycle;
car *sedan;
truck semi;
boat sailboat;
unicycle = new vehicle;
unicycle-> message(); //输出Vehicle message
/*
当编译器编译到上面语句的时候，会参照该对象指针所属的类名vehicle和函数名message去标识符表中查找该成员函数的首地址，查找到vehicle类的成员函数message的首地址，并使用call xxxxx语句替换该函数调用语句。*/
delete unicycle;
unicycle = new car;
unicycle -> message(); //输出Vehicle message
/*
当编译器编译到上面这句的时候，会参照该对象指针所属的类名vehicle和函数名message去标识符表中查找该成员函数的首地址，它查到的也是vehicle类的成员函数message的首地址，然后使用call xxxxx语句替换该函数调用语句。*/
sedan = (car *) unicycle;
sedan -> message(); //输出Car message
/*
当编译器编译到上面这句的时候，会参照该对象指针所属的类名car和函数名message去标识符表中查找该成员函数的首地址，它查到的是car类的成员函数message的首地址，然后使用call xxxxx语句替换该函数调用语句。
*/
delete sedan;
semi.message(); //输出Vehicle message
/*
当编译器编译到上面这句的时候，会参照该对象指针所属的类名car和函数名message去标识符表中查找该成员函数的首地址，在基类vehicle中它查到了成员函数message的首地址，然后使用call xxxxx语句替换该函数调用语句。
*/
sailboat.message(); //输出Boat message
/*
当编译器编译到上面这句的时候，会参照该对象指针所属的类名boat和函数名message去标识符表中查找该成员函数的首地址，它查到的是boat类的成员函数message的首地址，然后使用call xxxxx语句替换该函数调用语句。
*/
}