#include <cstdio>
#include <cstdlib>
#include <cstring>

struct String
{
  char *string_;
  String (char const* string)
    : string_ (strdup (string))
  {
    puts (__PRETTY_FUNCTION__);
  }
  ~String ()
  {
    puts (__PRETTY_FUNCTION__);
    strncpy (string_, "BOOM", strlen (string_));
    free (string_);
    string_ = 0;
  }
};

struct Strong : public String
{
  Strong (char const* string)
    : String (string)
  {
    puts (__PRETTY_FUNCTION__);
  }
  ~Strong ()
  {
    puts (__PRETTY_FUNCTION__);
    strncpy (string_, "BOOM", strlen (string_));
  }
};

inline String Strong_to_String (Strong const& strong)
{
  return String (strong.string_);
}

int 
main (int argc, char const* argv[])
{
  printf ("The strings: %s and %s\n",
	  Strong_to_String (Strong ("foe")).string_,
	  Strong_to_String (Strong ("bar")).string_);
}

