> первое что бросается в глаза - избыточный синтаксис.А если сложнее Hello World, то всё наоборот.
Пусть есть интерфейс (абстрактный класс) и 2 прямых наследника в каждом из которых есть динамическое выделение памяти (двумерные массивы-буферы). Абстрактный класс задаёт интерфейсы по работе. Первый наследник добавляет работу с первым буфером, второй наследник от первого наследника добавляет второй буфер, перегружает виртуальные методы по-своему и добавляет свои.
И пусть есть статическая функция, которая, принимает в качестве аргумента типы первого наследника и второго наследника, цель которое менять реальные значения внутри этих самых массивов-буферов.
Ну так вот. Вы в С++ напишите такую поэму с передачей указателя на буферы и виртуальными деструкторами, что переосмыслите свой предыдущий комментарий. А если у вас есть вторая статическая функция, которой нужны копии и третья, которой нужны полные копии вы упишитесь конструкторами копирования на все возможные случаи.
Для сравнения шарпе вы пишите только реализацию глубокого копирования, деструкторы только в случае потоков да и то вам скорее нужен просто IDispose. И ссылки в шарпе работают как надо, а не как в крестах.
И это я еще про итераторы в с++ молчу.
Есть разница между тем чтобы явно указывать модификаторы public перед каждой функцией и писать реализацию тонны рутинного мусора, которая в с++ обязательна для выполнения типовых задач.