这段代码中,Release为virtual,析构函数没有被声明称virtual,这时:
(1)(2)调用CDerive的Release,析构CDerive。
(3)能够正确调用CDerive的Release,析构CDerive。
(4)CDerive2没有实现自己的Release,这时调用的是CDerive的Release,析构CDerive。
输出:
(1)CDerive destraction
(2)CDerive destraction
(3)CDerive destraction
(4)CDerive destraction
(5)(6)析构IBase
(7)析构CDerive
(8)析构CDerive2,之后析构CDerive
输出:
(5)CDerive destraction
(6)CDerive2 destraction
(6)CDerive destraction
这里析构函数全部被声明为virtual:
(1)(3)调用CDerive的Release,析构CDerive。
(2)(4)调用CDerive的Release,析构CDerive2,析构CDerive。
输出:
(1)CDerive destraction
(2)CDerive2 destraction
(2)CDerive destraction
(3)CDerive destraction
(4)CDerive2 destraction
(4)CDerive destraction
(5)(6)析构IBase。
(7)析构CDerive。
(8)析构CDerive2,析构CDerive。
输出:
(7)CDerive destraction
(8)CDerive2 destraction
(8)CDerive destraction
如果利用virtual Release销毁对象时,析构函数如果非virtual,那么需要每个类都实现自己的virtual Release()。如果析构函数是virtual,那么只要基类实现一个virtual Release()就可以了。
如果用delete基类指针销毁对象,则需要基类和派生类都有virtual析构。
本例中用delete IBase*销毁CDerive和CDerive2都不行。但如果CDerive1和CDerive2都有virtual析构,则可以用delete CDerive*销毁CDerive2对象