哦,顺便说一下最开始这个程序的应用背景。
本来我对单根继承下的virtual dtor和对应的vtable实现感觉自己理解还算清楚。不过看到了我们正在使用的框架规则,就感觉有怀疑了。
这个框架,对于所有堆上的对象,有一个公共基类CBase,方便内存管理。只要是从基类派生出来的子类,new出来后,只要放到到一个管理器内,就不用管了。
但是,有一个规则说:如果不是从这个基类派生出来的,那么如果new出来后,也放到管理器内,就会有麻烦。我觉得这个也能理解,因为这个管理器很可能内部维护了一个CBase*的指针容器,它在释放对象时,遍历容器,调用delete,例如:
c++ 代码:
for(container<CBase*> it=coll.begin(); it!=coll.end(); ++it)
delete *it;
同时,我浏览框架代码,发现很多接口类,并没有定义virutal dtor,因此,如果是多继承,比如定义了一些接口Interface1, Interface2, 然后子类,继承CBase,实现Interface1和2,然后再把指向接口的指针放入管理器;那么就会像最前面的例子程序一样,crash。