Il n´existe pas de solution miracle, à toi de voir ce qui te va le mieux et ce qui est le mieux adapté à ta gestion des objets et PNJ . ..
Tu peux par exemple créer un objet de base puis créer des classes héritant de ce BaseObject en y ajoutant les spécificités de ces nouvelles classes . ..
Les PNJ devraient à mon avis être traités à part sachant qu´il y a plus de choses à faire avec eux notament l´IA, animations, les déplacements etc.. qui ne se font pas avec de simples objets.
Mais tu peux par exemple séparer depuis ton BaseObject les objets inertes et les "objets" vivants ( créatures, persos etc...)
Ensuite tu crées une liste de BaseObject* ( pointeurs of course) contenant tous les différents objets dans ta scène. Et suivant ce que c´est, tu effectue les traitements correspondant...
Ce qui te permet d´effectuer les opérations communes à tous les objets ( affichage, collisions etc...) Pour les PNJ tu peux créer une 2e liste ( des pointeurs toujours ca te permet de pointer sur les mêmes objets que la 1ere liste sans avoir de doublons) car certains traitements ne seront propres qu´à ces "objets" vivants ( IA, déplacements, dialogue etc...)
Enfin il existe beaucoup de solutions et je ne suis pas sur qu´il en existe une meilleure que les autres.
Pour les collisions ca dépend si c´est de la 2D ou 3D mais de manière générale l´astuce est de trouver les objets proches de celui qui se déplace ( pas besoin de tester les collisions sur un objet immobile, lol). Et dés que l´objet qui se déplace entre en collision avec d´autres objets ( immobiles ou pas) tu fais réagir ces derniers ( action -> réaction). A ce moment là tu dois faire intervenir quelques lois de physique, enfin tout dépend du réalisme de ton moteur.
Voilà ce que j´en pense "globalement".