Эти два действительно имеют мало общего друг с другом, одна точка пересечения состоит в том, что для того, чтобы воспользоваться преимуществами полиморфного поведения (виртуальные члены), вы должны использовать либо указатели, либо ссылки.Если вы назначаете производный экземпляр фактическому базовому экземпляру (в отличие от назначения адреса производного базового указателя или инициализации базовой ссылки с производным экземпляром), тогда любая производная функциональность просто будет потеряна (обычный термин вызывает этот объектнарезка).
И обратите внимание, что в вашем примере нет особого смысла для виртуальной пустоты make_sound (char const *), гораздо более распространенным было бы использование виртуальной формы void make_sound (), а производный тип знаеткакой звук производить.