Ich weiß über das Grundkonzept der virtuellen Funktion und Laufzeitanruf. Aber ich versuchte einig Stück Code ausgeführt wird, die mirKann jemand dieses Verhalten für die virtuelle Funktion erklären?
verwirrteclass A {
public:
A& operator=(char) {
cout << "A& A::operator=(char)" << endl;
return *this;
}
virtual A& operator=(const A&) {
cout << "A& A::operator=(const A&)" << endl;
return *this;
}
};
class B : public A {
public:
B& operator=(char) {
cout << "B& B::operator=(char)" << endl;
return *this;
}
virtual B& operator=(const B&) {
cout << "B& B::operator=(const B&)" << endl;
return *this;
}
};
int main() {
B b1;
B b2;
A* ap1 = &b1;
A* ap2 = &b1;
*ap1 = 'z';
*ap2 = b2;
}
Das Ausführen dieses Programms geben Sie mir die folgende Ausgabe: -
A& A::operator=(char) //expected output
A& A::operator=(const A&) //Why this Output? in case of *ap2 = b2;
b2
ein Objekt von B
Typ, aber noch geht es in virtuellen A& operator=(const A&)
und nicht virtuell B& operator=(const B&)
. Warum ist das so ?
Chalesworth ist es so, dass ein Zeigertyp Angelegenheiten während des Funktionsaufrufs und nicht die Art von Objekt ist dieser Zeiger, auf den zeigt, was bei virtueller Funktion tatsächlich passiert? Weil hier ap2 ein Zeigertyp von A ist, aber auf ein Objekt vom Typ B zeigt? Ich irre mich irgendwo? – Invictus
@Ritesh: In der Zeile '* ap2 = b2' ist der Kompilierzeittyp von' * ap2' 'A'. Der Compiler kann also nur (virtuelle) Elementfunktionen berücksichtigen, die in der Schnittstelle vorhanden sind, die "A" darstellt. –