QueryInterface isn't a particularly controversial topic (and I haven't heard any grumbling about my last post) but I always invite you to verify everything I say on your own--partly to ensure that mistakes I make don't make their way too far into the wilderness*, but mostly because I think you'll understand the concepts best if you do a bit of digging and pick up the details from another author's perspective.
So if you want another explanation about the QueryInterface post I put together, you can read all about it on Larry Osterman's blog. His example is a little more subtle in that it deals with fragility in inherited interfaces (mine is simpler and deals with inheriting multiple unrelated interfaces in a single object), and he gets into the actual vtable implementation, but the moral of the story is the same: use QueryInterface.
Larry is a long-time developer at Microsoft, so any errors present in both my post and his post are either really obscure, or really well-ingrained Microsoftisms. Or both.
* To be clear, I do put a lot of effort into double-checking the facts to ensure you're getting high-quality posts. But errors can always inadvertently creep in, and I haven't developed enough of an ego to lie about that.