Und um die Frage nach dem 'warum' zu beantworten.
Das ist eine direkte Folge des Aufsuchalgorithmuses, den der Compiler
benutzt um die richtige Funktion auszuwählen.
Der Compiler beginnt bei der abgeleiteten Klasse und arbeitet sich in
Richtung Basisklasse vor. Er ist dabei auf der Suche nach der ersten
Klasse, die eine oder mehrere Funktionen des angegebenen Namens enthält.
Ist die Klasse erst einmal gefunden, dreht sich die Entscheidung nur
noch darum, welche der Funktionen mit ihrer Parameterliste am besten zu
den Argumenten passt. Falls gar keine passt, dann ist das ein Fehler,
der Compiler beginnt nicht erneut sich in Richtung Basisklasse
vorzuarbeiten und in einer Basisklasse eine besser passende Funktion zu
finden.
In der Kurzfassung:
zuerst wird ausgewählt, welche Klasse zuständig ist.
dann wird aus dem Satz von verfügbaren Funktionen die am besten
passende ausgewählt.
Da deine Klasse B eine Funktion
1 | void doAmazingStuff(double a, double b)
|
enthält, ist sie die Klasse unter deren Funktionen 'doAmazingStuff'
ausgewählt wird.
Und da gibt es nun mal nur die eine, die 2 double nimmt.
Das ist aber unvereinbar mit
und daher gibts den Fehler.
Die Klasse A, mit ihrer zusätzlichen Funktion doAmazingStuff, war
überhaupt nie auch nur Kandidat, der in Betracht gezogen worden wäre.
Daher sagt man auch: Ein Funktion in einer abgeleiteten Klasse überdeckt
(engl.: to hide) alle Funktionen gleichen Namens in den Basisklassen.