Nur nicht bekommen, wie man diesen Prototyp zu implementieren. Ich versuche, einen Container mit Objekten der Basisklasse der Worker*
Iteration des Containers zu erstellen, Objekte rufen die virtuelle Methode ->work()
. In Abhängigkeit von abgeleiteten Klasse auf Zeiger sollte es sein Eigen nennen außer Kraft gesetzt FunktionC++ Vererbung Casting, Eltern zu Kind und zurück
class Worker {
public:
Worker(...) { ... }
virtual void work() { /* justWork(); */ }
};
class Professional : public Worker {
public:
Professional(...) { ... }
virtual void work() override { /* workGood(); */ }
};
class Workplace {
public:
void train(Worker* worker) {
/* need to save object properties and
set pointer to derived class */
// *worker = Professional(worker);
worker = new Professional(worker);
/* following compiles fine, but when I call worker->work()
outside of this body it calls simple Worker::work()
when I need to call Professional::work() */
}
void fire(Worker* worker) {
/* need to save object properties
set pointer value back to
Parent/Base class Worker */
// *worker = Worker(worker);
}
};
int main()
{
Workplace workplace;
Worker* worker = new Worker();
worker->work(); // Worker::work() => justWork()
workplace.train(worker);
worker->work();
// should be Professional::work() => workGood(),
// but it calls Worker::work() => justWork()
workplace.fire(worker);
worker->work(); // Worker::work() => justWork()
return 0;
}
Sie übergeben 'Worker *' nach Wert hier: 'void train (Worker * worker) {'. Ich würde empfehlen, 'std :: unique_ptr' zu verwenden, um sie herumzugeben. –
user0042
Für 'Workplace :: train' übergeben Sie den Zeiger * als Wert *. Das bedeutet, dass Sie eine * Kopie * des ursprünglichen Zeigers haben, also ändert die Zuweisung nur die Kopie, nicht das Original, das Sie in der 'main' Funktion erstellt haben. –
@Someprogrammerdude so versuchte ich: 'Workplace :: Zug (Arbeiter & Arbeiter) {Arbeiter = Professional(); } workplace.train (* worker); ' Auch kein Erfolg, mache ich immer noch falsch? –