added virtual to_string() function