为什么需要基类指针指向派生类对象?

tech2025-11-28  6

为什么需要基类指针指向派生类对象?

我们知道虚函数可以让我们的类具备多态的功能,你肯定在此会有所疑惑,为什么需要基类指针指向派生类对象?派生类指针自己就能实现的功能,何必用基类指针来多此一举呢?其实这就不得不谈及多态的奥妙了。 假设我们有这样一群动物,鸟类,爬虫类,人类。现在我们想要分别实现每一类动物“走”这一概念,首先我们肯定是抽象出“走”这一个单独的概念,然后将它放进基类做一个虚函数,各个子类继承这个基类,在分别去实现各自的“走”。代码如下:

class Animal { public: virtual void walk() { cout << "Base walk of animal!" << endl; } virtual ~Animal() { cout << "Animal Down!" << endl; } }; class Bird: public Animal { virtual void walk() { cout << "Fly in the sky of bird!" << endl; } virtual ~Bird() { cout << "Bird Down!" << endl; } }; class Reptile : public Animal { virtual void walk() { cout << "Climb in the ground of reptile!" << endl; } virtual ~Reptile() { cout << "Reptile Down!" << endl; } }; class Human : public Animal { virtual void walk() { cout << "Walk in the ground of Human!" << endl; } virtual ~Human() { cout << "Human Down!" << endl; } };

这样做的好处不言而喻,更为重要的是,当我们想要用某个数据结构去存储不同对象时,比如我们想实现一个所有动物对象“走”得数组,遍历数组时向我们展示出不同动物对象走的情况,该怎么做呢?因为我们的数组只能实现同一类型数据存储,而我们又想展示出不同类型对象的“走”,所以很显然我们只需在数组中存储基类指针,然后把数组中的每个基类指针与相应的类对象进行动态绑定即可。代码如下:

int main() { vector<Animal*> walk; walk.emplace_back(new Bird()); walk.emplace_back(new Reptile()); walk.emplace_back(new Human()); for (const auto &c : walk) c->walk(); }

结果如图所示:

总结

基类指针指向派生类对象最大得优势在于,我们可以实现用数据结构存储不同类对象,并且分别展示出不同类对象的共有特性。

最新回复(0)