При изучении такого товарища как C++, который оброс legacy фичами и вместил в себе все возможные и невозможные стили написания программ, нужно исходить из задач, какие вы собираетесь решать.
Если вы будете работать в gamedev, то нужно сосредоточиться на низкоуровневых аспектах программирования: взаимодействию с драйверами, работе с графическими движками: объектно-ориентированности там будет мало: код будет больше похож на структурированный C, акцент будет делаться на перформанс всего и вся, потому что конечная цель - fps.
Если вы будете делать enterprise приложения, то там всё будет мало чем отличаться от C#, который вы уже знаете, как я понял. Если использовать "умные указатели" (shared_ptr, unique_ptr и пр.) и применять классические паттерны из ООП как в C#, то программы будут выглядеть почти так же, за исключением того, что для циклических ссылок придётся попотеть с weak pointers и хорошо знать memory model. Изучать тут лучше начинать с классических книг по ООП для C++, причем чем для более позднего стандарта написана книга, тем лучше. Всё потому что поздние стандарты и всякие либы типа Boost позволят вам не изобретать множество велосипедов и сразу приобщиться к хорошей структуре кода.
Если вы будете делать операционную систему или драйвера писать, то начинать надо с C: вначале его освоить на очень хорошем уровне, а потом уже изучать ООП, потому что вряд ли, опять же, у вас будет большая глубина иерархии классов и классы будут использоваться лишь для инкапсуляции поведения, а не для моделирования сложных взаимосвязей. Хотя уже есть примеры низкоуровневого кода с хорошей объектно-ориентированностью: всё потому, что C++ любит абстракции с нулевой стоимостью: например, если вы будете использовать не виртуальные методы, то компилятор сможет очень хорошо соптимизировать результирующий машинный код.