在调用成员函数时,不论是使用 this
指针还是其他方式,在派生类中并且在基类的构造函数 / 析构函数中,都会调用相关类的函数(包括虚拟函数)。
为什么会这样呢?在此过程中,对象的 vtable
指针是否被改变了?因为我理解一般情况下一个对象只有一个 vtable
指针,除非使用了多重继承。
以下代码可以说明我的意思:
#include <stdio.h>
class B {
public:
B()
{ printf("B constructor!\n"); f(); g(); }
virtual ~B()
{ printf("B destructor!\n"); f(); g(); }
virtual void f()
{ printf("f() in B!\n"); }
void g()
{ printf("g() in B!\n"); }
void h()
{ printf("h() in B!\n"); }
};
class D : public B {
public:
D()
{ printf("D constructor!\n"); f(); g(); }
virtual ~D()
{ printf("D destructor!\n"); f(); g(); }
virtual void f()
{ printf("f() in D!\n"); }
void g()
{ printf("g() in D!\n"); h(); }
};
int main()
{
D *d = new D;
B *b = d;
delete b;
}
在构造函数和析构函数中,调用所创建/销毁对象的成员函数。