Ich habe den folgenden Code geschrieben, um mein Problem zu erklären. Wenn ich die Zeile 11 kommentiere (mit dem Schlüsselwort "using"), kompiliert der Compiler die Datei nicht und zeigt diesen Fehler an : invalid conversion from 'char' to 'const char*'
. Es scheint die Methode void action(char)
der Parent
Klasse in der Son
Klasse nicht zu sehen .
Warum verhält sich der Compiler so? Oder habe ich etwas falsch gemacht?
class Parent
{
public:
virtual void action( const char how ){ this->action( &how ); }
virtual void action( const char * how ) = 0;
};
class Son : public Parent
{
public:
using Parent::action; // Why should i write this line?
void action( const char * how ){ printf( "Action: %c\n", *how ); }
};
int main( int argc, char** argv )
{
Son s = Son();
s.action( 'a' );
return 0;
}
c++
oop
inheritance
using
Julien Vaslet
quelle
quelle
Son s = Son();
. Das erstellt nur eine temporäre und ruft dann den Kopierkonstruktor auf.Son s;
Antworten:
Das
action
in der abgeleiteten Klasseaction
deklarierte Element verbirgt das in der Basisklasse deklarierte. Wenn Sieaction
einSon
Objekt verwenden, sucht der Compiler in den in deklarierten MethodenSon
, findet eine aufgerufeneaction
und verwendet diese. Die Suche in den Methoden der Basisklasse wird nicht fortgesetzt, da bereits ein passender Name gefunden wurde.Dann stimmt diese Methode nicht mit den Parametern des Aufrufs überein und Sie erhalten eine Fehlermeldung.
Weitere Erläuterungen zu diesem Thema finden Sie auch in den C ++ - FAQ .
quelle
Überraschenderweise ist dies Standardverhalten. Wenn eine abgeleitete Klasse eine Methode mit demselben Namen deklariert wie eine von der Basisklasse definierte Methode, verbirgt die Methode der abgeleiteten Klasse die Methode der Basisklasse.
Siehe C ++ - FAQ
quelle
Ein Hinweis zur Vorsicht: Die Notwendigkeit, in dieser Situation ein "using" zu verwenden, ist eine rote Fahne, die Ihren Code für andere Entwickler möglicherweise verwirrt (schließlich hat er den Compiler verwirrt!). Es ist wahrscheinlich, dass Sie eine der beiden Methoden umbenennen sollten, um anderen Programmierern die Unterscheidung zu verdeutlichen.
Eine Möglichkeit:
void action( const char how ) { takeAction( &how ); } void action( const char * how ) { takeAction(how); } virtual void takeAction(const char * how) = 0;
quelle
Wenn in einer abgeleiteten Klasse eine überladene Funktion neu definiert wird, wird die gesamte überladene Funktion in der Basisklasse ausgeblendet. Eine Möglichkeit, beide Funktionen einzuschließen, besteht darin, eine Funktionsüberladung in Klassen zu vermeiden. oder Sie können das verwendete
using
Schlüsselwort verwenden.quelle