Ich habe gesucht, bevor Sie Fragen, aber din't nichts gefunden für mein Problem arbeiten.C++ - Machen Sie Zeiger auf Superklasse Match Unterklasse Argument in Funktion
Ich möchte einen Zeiger auf die Oberklasse (die immer auf eine der Unterklassen verweist) machen ein Unterklassenargument (Zeiger oder Const-Verweis) in einer Funktion.
Kontext: Erstellen Sie einen "fortgeschrittenen" Rechner in C++.
Lassen Sie mich Ihnen weitere Informationen zu den Klassen in dieser Ausgabe von mir verwendet:
Zuerst haben wir die Literale:
class Literal {};
class IntegerLiteral : public Literal {};
class RealLiteral : public Literal {};
class RationalLiteral : public Literal {};
//....
Wir haben einen Stapel verwendet, um die wörtlichen Objekte zu speichern, indem die Speicherung ihres Adressen
// If st is instance of stack then :
st.top(); // returns a Literal*
Und wir Operator Objekte, die mit dem Stapel durch Entstapeln die richtigen Zahlen von Wörtliche * (abhängig von der Bedienungs arity) interagieren, Anwenden des Operators auf die Literal * -Objekte und schließlich Stapeln des Ergebnisses.
class Operator {
int n; // operator arity
public:
virtual void executeOperator(stack *st) = 0; //
};
Einer der Operator Unterklasse (zum Beispiel):
class PlusOperator : public Operator {
public:
virtual void execute(StackUTComputer *st) override {
Literal* arg1 = st->top();
Literal* arg2 = st->top();
Literal* result = applyOperator(arg1, arg2);
st->pop(); st->pop();
st->push(result);
}
Literal* execute(IntegerLiteral* a, IntegerLiteral* b) {
return new IntegerLiteral(a->getValue() + b->getValue());
}
Literal* execute(IntegerLiteral* a, RealLiteral* b) {
return new RealLiteral(a->getValue() + b->getValue());
}
Literal* execute(IntegerLiteral* a, RationalLiteral* b) {
return new RationalLiteral(
a->getValue() + (a->getValue()*b->getDenominator()),
b->getDenominator()
);
}
// ...
};
Mein Ziel hier (durch die Funktion applyOperator
Überlastung) ist auf „magische Weise“ der Computer wissen lassen, welche Anruffunktion auf die reale Abhängigkeit Typ von Literal, der vom Operator entstapelt wurde (die Klasse Literal ist abstrakt: Der Stapel enthält immer spezifische Unterklassen von Literal).
Aber es funktioniert nicht so, wie ich will. Ich meine, dass der Aufruf applyOperator(arg1, arg2)
(mit arg1
und arg2
als Literal *) ungültig ist, da keine Funktionen mit der Signatur übereinstimmen.
Ich bin mir bewusst, dass ich den C++ - Polymorphismus auf die andere Art und Weise verwende, die normalerweise verwendet wird (das ist ein Unterklassenargument für eine Funktion, die ein Superklassenargument verwendet).
Ich weiß nicht, wie ich meine Architektur umkehren soll, um den Polymorphismus richtig zu benutzen, und vielleicht gibt es eine Syntax-hilfreiche Lösung, um meine Idee zum Laufen zu bringen.
Wie auch immer, ich bin dankbar für Ihre Hilfe !!
Raphael.
Weniger Prosa, konkretere Fehlermeldungen und ein [MCVE] würde sehr helfen, diese Frage zu verbessern. –
Hier gibt es keine Deklaration von "applyOperator". –