Wenn eine virtuelle Methode über einen Basiszeiger oder eine Basisreferenz aufgerufen wird, die auf ein abgeleitetes Klassenobjekt verweist, wird zuerst die Basismethode und dann die abgeleitete Methode aufgerufen wird aufgerufen. Könnte jemand erklären, warum dieses Verhalten implementiert wird, anstatt die abgeleitete Klassenmethode direkt aufzurufen?C++ - Vererbung: Virtuelle Methoden der Basis werden zuerst aufgerufen, dann wird die abgeleitete Methode aufgerufen
Klasse Eltern
class Parent{
private:
int money;
public:
void set_money(const int& m){
money = m;
}
virtual const int& get_money() const{
std::cout << "Parent version\n";
return money;
}
};
Klasse Child
class Child : public Parent{
private:
int my_money;
mutable int family_money;
public:
void set_money(const int& m){
my_money = m;
}
const int& get_money() const{
family_money = my_money + Parent::get_money();
std::cout << "Child version\n";
return family_money;
}
void set_parent_money(const int& m){
Parent::set_money(m);
}
};
Haupt
int main(){
Child c;
c.set_parent_money(20);
c.set_money(50);
Parent *p = &c;
cout << "Pointer " << p->get_money() << endl;
Parent& pr = c;
cout << "Reference " << pr.get_money() << endl;
Parent po = c;
cout << "Object " << po.get_money() << endl;
return 0;
}
Ausgabe
Parent version
Child version
Pointer 70
Parent version
Child version
Reference 70
Parent version
Object 20
Sie rufen Eltern get_money in Kind get_money. – hank