#include <iostream>

class Base
{
public:
    Base() { std::cout << "Base" << std::endl; }
    virtual ~Base() { std::cout << "~Base" << std::endl; }
};

class Derived : public Base
{
public:
    Derived() { std::cout << "Derived" << std::endl; }
    virtual ~Derived() { std::cout << "~Derived" << std::endl; }
};


template<class T> T *Safe_Or_Not (T *object)
{
    object->T::~T ();
    ::new (object) T;
    return object;
}

int main(int argc, char *argv[])
{
    Base* b = new Derived;

    b = Safe_Or_Not(b);
    delete b;
    return 0;
}