I think in programming (not just C++) OOP is a hard thing to learn. As for C++, I think Catfish would have it with his reply. Pointers, if you find a good reference (like this site's tutorials) are fairly straight forward after using them a few times.
I'm ashamed to admit, but OOP is lost on me. Things where I know I should use classes and such get me so frustrated that I ultimately just avoid structs, classes, etc just to get the code done (if possible).
Maybe scientific computing is the most difficult. You need very advanced mathematical and scientific knowledge, you're working with massively parallel systems, maybe even distributed, you're working with large data and interacting with databases, problems can take supercomputers hours, days, months or even years to solve, the algorithms need to extremely efficient, your math might need to be very precise, the problems you're trying to solve are often new, and you probably wont have much to fall back on.
@BHX C++ doesn't make a very large difference between an interface and an abstract class like Java does. It might help to learn OOP in Java first, and then come to C++. C++ doesn't make the distinction because it is open to free-form of design, whereas Java sort of forces a consistent design across all Java code. You'll probably find OOP much easier to learn in Java.
As far as hard to program thing go, I would say anything where lives and livelihood of people depends on the quality of your work - that could be an RT application (or the OS itself) where one unexpected submillisecond delay is a catastrophic failure, or even a financial application, where millions are made or lost on those time scales. The kind of software where you (or, realistically, your company) has to pay for every error or delay.
Oh, and that is the hardest thing for C++ in particular because other popular languages aren't capable of dealing with tasks like that (well, C is, but it's harder to use)
Ah - I guess you are talking about e.g. asigning a std::vector<short> to a std::vector<int>? The compiler treats them as different types so operator= would need to be defined for such a conversion, but you can still do it in a way that looks nice: http://liveworkspace.org/code/1L32Qo$0
Iterators :D
If you're writing the class in question and want to provide operator= definitions for conversions like that, you can do some magic: http://en.cppreference.com/w/cpp/types/is_assignable
You can define the templated operator= so it will error if the type is not assignable from ;)
@LB:
Yeah, basically, to practice what I've learned in C++, I've decided to re-create the basic objects of the .Net framework (Object, Int32, Int64, Double, etc), kind of doing a small .Net++. Anyways, Having issues making Int32 work with Int64 naturally. I could create more overloading operators, some for each combinations, however this feels like cheating and using too much code.
You should provide template instantiations of the type traits templates that enable your primitive wrapper classes to work like the real primitives in the context of code that uses those templates to check compatibility. Obviously you wouldn't lie and say they were actually primitive, but you could explain all the other traits.
Oh, I thought you were talking about the concept of stack-allocated memory, which may actually be slightly confusing to people who have ever used any other language.