我知道在面向对象的编程语言中运行时多态性的用途是什么。例如,基类Superhero
可用于定义Superhero
的基本抽象属性,可以在不同的超级英雄中继承和扩展,例如Batman
。
我也知道我们在存在is-a
关系时使用继承,例如Superman
is-a
Superhero,我们可以使用Base类指针指向Derived类对象例如......
Superhero *h = new Spiderman();
有效。
但我想知道在什么情况下我们需要做这样的事情,为什么我们不能只使用......
Spiderman *s_man = new Spiderman()
什么情况或情况会迫使我们使用Base类指针来保存Child类对象。
如果有人能向我说明这一点,我将感激不尽。
答案 0 :(得分:4)
使基类指向派生类允许您对基类对象组执行操作,就好像它们都是相同的一样。在这个设计但奇迹般的电影宇宙符合示例中,您可以在单个列表中收集所有复仇者并执行某种操作。
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();
}
答案 1 :(得分:0)
如果你想为所有类型的超级英雄进行标准调用。但实施方式不同。这里没有语法检查:)
class Superhero
{
public:
virtual void changeClothes() = 0;
}
class Spiderman : public Superhero
{
public:
void changeClothes()
{
body.wear(spideySuit);
}
};
class Hulk public Superhero
{
public:
void changeClothes()
{
body.shorts.TearApart();
}
};
SuperHero * spidy = (Superhero *) new Spiderman;
SuperHero * hulkster = (Superhero *) new Hulk;
spidey->changeClothes();
hulkster->changeClothes();
答案 2 :(得分:0)
考虑一个超级英雄指针列表。这样的列表可以存储对new Spiderman()
,new Superman()
和继承超级英雄的其他对象的引用(指针)。
@lcs提供了这个概念的精彩说明。