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

时间:2017-01-31 15:50:27

标签: c++ oop inheritance polymorphism virtual-functions

我知道在面向对象的编程语言中运行时多态性的用途是什么。例如,基类Superhero可用于定义Superhero的基本抽象属性,可以在不同的超级英雄中继承和扩展,例如Batman

我也知道我们在存在is-a关系时使用继承,例如Superman is-a Superhero,我们可以使用Base类指针指向Derived类对象例如......

Superhero *h = new Spiderman();

有效。

但我想知道在什么情况下我们需要做这样的事情,为什么我们不能只使用......

Spiderman *s_man = new Spiderman()

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

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

3 个答案:

答案 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提供了这个概念的精彩说明。