Angenommen, ich habe diese zwei Klassen:C++ späte Bindung auf Funktion überlastet
class Hello {
//members
public:
virtual int doit() {
return 3;
}
};
class Wow : public Hello {
//members
public:
virtual int doit() {
return 2;
}
};
int main(int argc, const char *argv[]) {
Hello *c = new Wow();
return c->doit();
}
Wie wir alle wissen, wird dieser Code durch eine späte Bindung in C behandelt werden ++, in LLVM IR von Clang wie folgt umgesetzt:
; ...
%7 = bitcast %class.Wow* %5 to %class.Hello*
store %class.Hello* %7, %class.Hello** %c, align 8
%8 = load %class.Hello*, %class.Hello** %c, align 8
%9 = bitcast %class.Hello* %8 to i32 (%class.Hello*)***
%10 = load i32 (%class.Hello*)**, i32 (%class.Hello*)*** %9, align 8
%11 = getelementptr inbounds i32 (%class.Hello*)*, i32 (%class.Hello*)** %10, i64 0
%12 = load i32 (%class.Hello*)*, i32 (%class.Hello*)** %11, align 8
%13 = call i32 %12(%class.Hello* %8)
; ...
Meine Frage ist, was passiert, wenn ich schaffen will eine Funktion check
zum Beispiel in einem anderen Namensraum wie folgt aufgerufen:
namespace somewhereelse {
void check(Hello *c) {
// Do something
}
void check(Wow *c) {
// Do something else
}
}
Kann eine Art späte Bindung auf verschiedene Funktionsüberlastungen angewendet werden?
Ich bin ein bisschen verwirrt, diese Überlastungen in der Tat funktionieren und die richtige Version von 'check' wird je nach Art des an die Funktion übergebenen Zeigers aufgerufen. Was erwartest du darüber hinaus? – johnbakers
Ich gebe nur einen Zeiger auf die Oberklasse, offensichtlich. Ich brauche die Laufzeit, um die richtige Überladung zu wählen, abhängig vom Zielobjekt. Dies ist die Definition für späte Bindung – NoImaginationGuy
ich sehe, würde nicht eine einzige 'check' Funktion akzeptieren die Basisklasse Zeiger in der Lage sein,' dynamic_cast' zu verwenden, um Verhalten für den wahren zugrunde liegenden Typ anzupassen? Sie müssten einen neuen Zeiger erstellen, ihn umwandeln und das Ergebnis testen, um zu sehen, ob dynamic_cast die Besetzung bestätigt hat. mehr Arbeit, aber ich denke, das ist, was dynamic_cast für – johnbakers