C.4.6 识别继承对象的构造函数
对于继承对象,它的构造函数(constructors)很有趣,因为它会对虚拟函数表指针进行初始化!如果你看一下两个构造函数(一个是继承类构造函数,另一个是该继承类的基类的构造函数),你会发现两者都会初始化对象的虚拟函数表(尽管对象只存放了一个虚拟函数表指针)。每个构造函数初始化指向它自己的虚拟函数表的虚拟函数表指针。这是因为构造函数不实例化的到底是哪种对象类型——是继承类的对象还是基类的对象。下面是一个简单的继承类构造函数的代码。
|
注意这个构造函数是怎样调用基类的构造函数的。这就是C++中对象的初始化方法。要调用初始化对象。调用对应类的构造函数来初始化对象,如果这个对象是继承类对象,编译器会把其父类的构造函数加在子类构造函数代码之前。在每一层父类的构造函数中都会执行这一过程,直到调用到基类的构造函数为止。下面是一个基类构造函数例子。
|
要注意的是:基类的构造函数将虚拟函数指针指向自己的拷贝,然后在返回后马上就被继承类的构造函数替换掉了。还要指出的是这个函数没有调用任何其他的构造函数,因为它是基类的构造函数。如果你跟踪整个类的构造函数调用链(即每个类的构造函数都调用其父类的构造函数),你就会知道这里已经调用基类的构造函数了,因为这个构造函数没有再调用其他任何一个构造函数,它只是初始化了虚拟函数表然后返回的。
| 回书目 上一节 |