“giving items as a reward/requiring items as a reward is one of many things a quest will need to do.”
rewarding/requiring items are generic things an inventory can do, so thats not true. quest will not need to do that, if your inventory handles that functionality.
your current method of using quest objects wastes more memory than moving their functionality into the inventory, and moving their data into quest structs.
“The quest doesn’t need to know what the objective is, just that it’s complete”
that sounds like data to me. why make it an object, when it can be a struct?
“The location objective will just inform the quest that the player has reached the destination.”
reaching a destination can be determined by collision with an actor. its no different than a pickup item.
“There are also many different types of objectives and rewards, some objective examples: Collect x of item, kill x of enemy, go to location, complete another objective/quest, interact with object in the world etc.”
those are all the same thing. actor gives item to inventory, based on the type of item, the inventory checks if other relevant items exist, if so, inventory gives itself a questcomplete item. all of that functionality can be built out of 2 functions that the inventory already does: adding items, checking for items.
“Also, quest rewards can be: other quests, objectives, items, experience, an area of the map oppening up, a boss spawning, new crafting blueprint, stat boosts etc.”
all of those things can be simple items in the inventory, mixed with actors that check for those items before spawning a boss, or opening a door, etc…
“Also all the objects I create have functionality, otherwise I wouldn’t have made them.”
some things should not have functionality. its called data. my main point is that if you want to reduce memory, i suggest you replace as many commonly occurring objects with structs, as you possibly can, it will improve performance.