什么时候需要基类指针指向 C++ 中的派生类对象?

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)

什么情况或情况会迫使我们使用基类指针来保存子类对象。

如果有人能向我说明这一点,我将不胜感激。

lcs*_*lcs 5

将基类指向派生类允许您对基类对象组执行操作,就好像它们都是相同的一样。在这个人为但奇妙的符合电影宇宙的示例中,您可以将所有复仇者收集在一个列表中并执行某种操作。

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)