何时需要指向派生类对象的基类指针 C++
When do you need a base class pointer to a derived class object in C++?
我知道运行时多态性在面向对象编程语言中的用途是什么。例如,基类Superhero
对于定义可以在不同的超级英雄中继承和扩展的Superhero
的基本抽象属性很有用,例如Batman
。
我也知道,当存在is-a
关系时,例如,Superman
is-a
超级英雄,我们使用基类指针指向派生类对象,例如......
Superhero *h = new Spiderman();
有效。
但我想知道在什么情况下我们需要做这样的事情,为什么我们不能只使用......
Spiderman *s_man = new Spiderman()
什么情况或情况会迫使我们使用基类指针来保存子类对象。
如果有人能向我说清楚这一点,我将不胜感激。
通过基类指向派生类,您可以对基类对象组执行操作,就好像它们都相同一样。在这个人为但符合奇迹的电影宇宙的例子中,您可以将所有复仇者收集在一个列表中并执行某种操作。
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();
}
如果你想对所有类型的超级英雄进行标准调用。但实现是不同的。这里没有语法检查:)
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();
考虑一个超级英雄指针列表。 这样的列表可以存储对new Spiderman()
、new Superman()
和其他继承超级英雄的对象的引用(指针)。
@lcs很好地说明了这一概念。
相关文章:
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 如何在基类指针向量的元素上应用重载的多态函数
- C++函数解析基类指针到派生类指针
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 从基类指针派生派生类的模板类型
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 无法将派生类存储在基类指针的向量中
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 基类指针:在哪里使用 new 和 delete
- 如何在CRTP实现中传递基类指针
- C++继承从基类指针访问派生类中的非虚拟函数
- 通过基类指针获取派生类对象的引用
- C++通过基类指针提升子类的序列化
- 将派生对象分配给函数内的基类指针
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?