您是否必须传递删除new返回的相同指针,或者您可以将指针传递给其中一个类基类型?例如:
class Base { public: virtual ~Base(); ... }; class IFoo { public: virtual ~IFoo() {} virtual void DoSomething() = 0; }; class Bar : public Base, public IFoo { public: virtual ~Bar(); void DoSomething(); ... }; Bar * pBar = new Bar; IFoo * pFoo = pBar; delete pFoo;
当然,这大大简化了.我真正想要做的是创建一个充满boost :: shared_ptr的容器,并将其传递给一些代码,这些代码在完成后将从容器中删除它.这段代码对Bar或Base的实现一无所知,并且依赖于shared_ptr析构函数中隐含的delete运算符来做正确的事情.
这可能有用吗?我的直觉说不,因为指针不会有相同的地址.另一方面,dynamic_cast
mov eax, DWORD PTR _this$[ebp]
跟踪汇编程序显示这是传递给delete函数的指针.谜团已揭开.
我已经修复了将虚拟析构函数添加到IFoo的示例,这是一个简单的疏忽.再次感谢所有指出的人.
是的,它将起作用,当且仅当基类析构函数是虚拟的时,您已经为Base
基类而不是IFoo
基类.如果基类析构函数是虚拟的,那么当您调用operator delete
基类指针时,它使用动态调度来通过在虚函数表中查找派生类析构函数来找出如何删除该对象.
在你的多重继承的情况下,它只有在你删除它的基类有一个虚拟析构函数时才会起作用; 可以让其他基类没有虚拟析构函数,但前提是你不尝试通过其他基类指针删除任何派生对象.