Deduplicate << operator implementation on inheritance
Yes use a virtual print() function.
PS. I would also make the toString use the virtual print function to make it more effecient.
class Person 
{
    // OTHER STUFF

    virtual void print(std::ostream&amp; target = std::cout) const
    {
        target &lt;&lt; firstName &lt;&lt; &quot; &quot;;
        if (middleName != &quot;&quot;) {
            target &lt;&lt; middleName &lt;&lt; &quot; &quot;;
        } 
        target &lt;&lt; lastName;
    }
    std::string toString() const
    {
        std::stringstream  stream;
        this-&gt;print(str);
        return stream.str();
    }

    friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; target, Person const&amp; person)
    {
        person.print(target);
        return target;
    }
};


class Tweeter: public Person
{
    // OTHER STUFF


    // Don't need this any more: =&gt; std::string toString() const;
    // Don't need this any more: =&gt; friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; target, Tweeter const &amp; source);

    virtual void print(std::ostream&amp; target = std::cout) const override
    {
         target &lt;&lt; &quot;[&quot; &lt;&lt; to_string(id) &lt;&lt; &quot;] &quot;;
         Person::print(target);
         target &lt;&lt;  &quot; (&quot; &lt;&lt; twitterHandle &lt;&lt; &quot;)&quot;;
    }
};