That depends on the relationship between ClassAAA and ClassBBB. The snippet you posted only works if ClassAAA inherits from ClassBBB (which you haven't indicated).
Or if both ClassAAA and ClassBBB inherit from a common base class, you can do this:
And so therefore when const ClassBBB& operator*(const ClassAAA& first, const ClassBBB& second) gets called, I run into an issue, because it's telling me this function can't return ClassAAA object reference.
I've even tried creating pointers to those objects passed as parameters, but it didnt work. Is that something I should be focusing on, pointers, or am I simply just missing something elementary?
Yes, you're missing the fact that you can't return a class that something is not derived from.
i.e. If B is derived from A, you can return an A, but the return type of your operator must be A.
If B is derived from A and the return type is A, you can return B, but B will be "downcast" to A.
See my ClassBase example in my previous post for a way to do this.
I've even tried creating pointers to those objects passed as parameters, but it didnt work.
Pointers won't change anything, other than to add a level of indirection. The return type must match, or be a base class of both.