我刚才在每个类里加了两个输出用于查看指针位置:
c++ 代码:
static void* operator new(size_t size){
void* p=::operator new(size);
std::cout<<"Base2 new: "<<std::hex<<p<<"\n";
return p;
}
static void operator delete(void* p){
std::cout<<"Base2 del: "<<std::hex<<p<<"\n";
::operator delete(p);
}
程序输出:
Derived new: 0x6a02a8
f
Base2 del: 0x6a02ac
11946 [sig] a 3356 _cygtls::handle_exceptions: ...
所以pb1, pb2和p实际指向的位置是不同的。
而如果,调用delete pb1,就会显示:
Derived new: 0x6a02a8
f
Derive dtor
Derived del: 0x6a02a8
程序正确的进入了子类的operator delete,而不是进入了pb1的operator delete
有趣的是,这是个多重继承,如果把Base2的virtual dtor打开,并且delete pb2,则程序输出:
Derived new: 0x6a02a8
f
Derive dtor
Base2 dtor
Base1 dtor
Derived del: 0x6a02a8
注意到:第一父类Base1的dtor也被调用了。这里面vtable是什么样子呢?