只是不明白,如何實現這個原型。 我試圖創建容器的基類的對象的Worker*
迭代容器,對象將調用虛擬方法->work()
。根據派生類的指針應該叫他自己重寫功能C++繼承鑄造,父母對孩子和回
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;
}
你在這裏通過'Worker *'值:void train(Worker * worker){'。我建議使用'std :: unique_ptr'來傳遞它們。 –
user0042
對於'Workplace :: train',您通過值*傳遞指針*。這意味着你有一個原始指針的*副本,所以這個分配只會改變副本,而不是你在'main'函數中創建的原始副本。 –
@Someprogrammerdude所以我嘗試過: 'Workplace :: train(Worker&worker){worker = Professional(); } workplace.train(* worker);' 也沒有成功,我還在做錯嗎? –