n00*_*che 1 c++ oop polymorphism inheritance virtual-functions
我知道在面向对象的编程语言中运行时多态有什么用。例如,基类Superhero对于定义Superhero可以在不同超级英雄中继承和扩展的基本抽象属性很有用,例如Batman。
我也知道我们在有is-a关系的时候使用继承,比如Superman is-aSuperhero,我们可以用一个Base类指针来指向一个Derived类对象比如...
Superhero *h = new Spiderman();
Run Code Online (Sandbox Code Playgroud)
已验证。
但是我想知道在什么情况下我们需要做这样的事情,为什么我们不能只使用......
Spiderman *s_man = new Spiderman()
Run Code Online (Sandbox Code Playgroud)
什么情况或情况会迫使我们使用基类指针来保存子类对象。
如果有人能向我说明这一点,我将不胜感激。
将基类指向派生类允许您对基类对象组执行操作,就好像它们都是相同的一样。在这个人为但奇妙的符合电影宇宙的示例中,您可以将所有复仇者收集在一个列表中并执行某种操作。
std::vector<Superhero*> GetAvengers()
{
std::vector<Superhero*> avengers;
avengers.push_back(new Spiderman());
avengers.push_back(new CaptainAmerica());
avengers.push_back(new IronMan());
avengers.push_back(new Thor());
// ... ad nauseam for three generations of unnecessary standalone films
return avengers;
}
void FightThanos()
{
SuperVillan* thanos = new Thanos();
auto Avengers = GetAvengers();
for(auto&& avenger : Avengers)
{
avenger->SaySomethingSnarky();
avenger->ParticipateInMontageActionSequence(thanos);
}
// Clean up after the avengers, they're not needed for another 4 years
for(auto&& avenger : Avengers)
{
delete avenger;
}
avengers.clear();
}
Run Code Online (Sandbox Code Playgroud)