und destruktor der basisklasse würde ich virtual machen.
Würde ich nicht a priori, nur weil Vererbung im Spiel ist. Sinnvoll ist das schliesslich nur, wenn man polymorphes Verhalten erzielen möchte, also wenn über Basisklassenzeiger/-referenzen virtuelle Funktionen der abgeleiteten Klassen aufgerufen werden sollen.
Ich dachte es ist nötig Destruktoren in Klassenhierachien virtuell zu definieren, da diese sonst evtl nicht alle aufgerufen werden.
Zum Zeitpunkt des Destruktoraufrufs ohne nicht erkennbar ist ob bei
B* instance = new B();
delete (A*)instance;
auch der Destruktor von B aufgerufen werden soll.
Im allgemeinen würde ich "virtual" auch nicht davon abhängig machen ob die Methoden auch über Basisklassenzeiger aufgerufen werden sollen, sondern ob sie von der ableitenden Klasse überschrieben werden sollen. Alles andere fürt bei eventuellen Refactorings (Wenn man dann doch mal den Basisklassenzeiger verwendet) zu unerwartetem verhalten und erzeugt Fehler die schwierig zu finden sind.
Kann man natürlich handhaben wie man will, aber ich persönlich möchte bei der Nutzung der Klasse nicht darauf achten welche Methoden ich jetzt virtual gemacht habe und welche nicht.