Вам нужно передать удаление того же указателя, который был возвращен новым, или вы можете передать ему указатель на один из базовых типов классов? Например:
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 и будет полагаться на подразумеваемый оператор delete в destructor shared_ptr, чтобы делать правильные вещи.
Может ли это работать? Моя интуиция говорит "нет", поскольку указатели не будут иметь одинаковый адрес. С другой стороны, dynamic_cast < Bar * > должен работать, поэтому где-то компилятор хранит достаточно информации, чтобы понять это.
Спасибо за помощь, всем, кто ответил и прокомментировал. Я уже знал важность виртуальных деструкторов, как показано в моем примере; увидев ответ, я немного подумал и понял, что целая причина для виртуального деструктора - это точный сценарий. Таким образом, он должен был работать. Я был брошен из-за отсутствия видимых средств преобразования указателя обратно в оригинал. Немного больше мышления побудило меня поверить, что есть невидимые средства, и я предположил, что деструктор возвращает истинный указатель на удаление, чтобы освободить. Исследование скомпилированного кода из Microsoft VС++ подтвердило мое подозрение, когда я увидел эту строку в ~ Base:
mov eax, DWORD PTR _this$[ebp]
Отслеживание ассемблера показало, что это был указатель, передаваемый функции удаления. Тайна решена.
Я установил пример добавления виртуального деструктора в IFoo, это был простой надзор. Еще раз спасибо всем, кто указал на это.