Concordo con Scara. Prenditi un pò di tempo per fare uno schema come quello che ha fatto lui e cerca di realizzare la gerarchia più efficiente possibile.
Per rispondere alle tue tre domande sull'interazione tra oggetti, tutto dipende da come il problema è organizzato nella vita reale. Facevo l'esempio dell'auto e della ruota. Lì è chiaro che nel costruttore della classe auto ha perfettamente senso istanziare un oggetto della classe ruota.
Un altro esempio è quello di un programma con una GUI e la logica di business. Immagina che ad ognuna di queste due macro-entità faccio capo una classe specifica. E' ovvio che non ha alcun senso istanziare un oggetto di classe GUI all'interno della classe "logica di business" e viceversa.
In questo caso il codice che serve per far comunicare questi due mondi ( che dovranno comunicare, altrimenti i dati prodotti dalla logica di business non verranno mai visualizzati tramite GUI ) va nel cosidetto main. Occhio che il main lo puoi benissimo considerare come la classe principale ( root in gergo ), per cui si ritorna al discorso precedente, cioè nel paradigma OOP è tutto un gioco tra classi e oggetti.