在简单示例中在 c++ 中使用多态性有什么好处

What is the benefit of using Polymorphism in c++ on simple example?

本文关键字:什么 多态性 简单 c++      更新时间:2023-10-16

我有一个简单的程序,显示多态性。问题:在简单调用 dr1.test() 和 dr2.test() 之前使用 bs->test() 有什么好处?

#include <iostream>
using namespace std;
class base
{
public:
    virtual void test()=0;
};
class derieved1:public base
{
public:
    void test(){cout<<"Derieved 1"<<endl;}
};
class derieved2:public base
{
public:
    void test(){cout<<"Derieved 2"<<endl;}
};
int main()
{   
    derieved1 dr1;
    derieved2 dr2;
    base* bs;
    bs=&dr1;bs->test();
    bs=&dr2;bs->test();
    dr1.test();
    dr2.test();
    return 0;
}

谢谢你的回答。

在您的示例中,使用多态性没有附加值。 多态性在您不再知道派生类是什么的情况下增加了价值。

例如:

void testFunction(base* tester)
{
  tester->test();
}

编辑:
当然,还有一个附加值:表明多态性确实有效。

尽管这似乎是一个愚蠢的问题,但我从新手那里多次听到这个问题,这对于任何一开始学习 oop 的人来说都是一个真正的疑问。当然,你在那个例子中是对的。但是,在现实世界中,您不会在一页上编写所有程序!因此,当您有一些复杂的逻辑可以分为您知道的东西和您不知道的东西时,它会有所帮助。你可以编写你所知道的,并为其他人提供钩子来填写你不知道的东西,但他们知道什么。

以旅行社为例,他们不知道巴士公司和火车运营商如何安排和运行他们的服务。但是,他们知道如何从不同类型的运营商那里获得最优惠的价格(但是,请记住,他们都是公共汽车/火车运营商)。因此,他们只需要一个合同(相当于您的基类),通过该合同,他们知道如何从每个公共汽车/火车运营商那里获取给定日期的时间表(即,我想要某某目的地的某某日期的可能时间表)。只要所有运营商都遵守此合同,旅行社就可以做他们最了解的事情。即,获取所有这些可能的时间表,并为他们的客户选择最好的时间表。选择最好的是旅行社的任务。他们不必关心公共汽车/火车运营商如何在内部维护时间表/成本等(这是派生的类实现)。由于旅行社只处理与公共汽车/火车运营商的合同,以后如果有新的公共汽车/火车运营商来了,旅行社的逻辑不需要修改(考虑你的问题,如果你使用 d1.test() 和 dr2.test() 如果添加了一个新的 DerivedClass3,你不应该改变你的代码来处理这种情况吗?

你会在各行各业看到这种模式。你知道外出就餐的合同。查看菜单,订购食物,付款并返回(基类方法)。无需知道他们如何烹饪,如何制作菜单等。

因此,简而言之,多态性可以帮助您实现以下情况:您可以独立实现程序的一部分,而无需知道依赖实现的内部细节,而只能通过了解接口。

因此,在您的示例中,您可以仅使用基类实现复杂的算法或逻辑,而不关心存在哪些派生类。算法的用户可以添加不同类型的派生类的各种实例,并且您的算法仍然可以工作。

希望这有帮助..

在这种特殊情况下,使用多态性可能存在缺点。调用dr1.test()将静态解析,而通过基指针调用它可以动态解析调用,因此可能会产生一些开销。(我说"可以",因为编译器可以优化这一点)。

多态性通常没有好处。 除了像你这样的实验,除非找到使用它的明确理由,否则可能应该避免多态性。

但是,确实出现了使用多态性的明确原因。 众所周知,大多数这样的原因很难在几段中充分解释 - 而且在太多的编程书籍中解释得很差。 令人遗憾的是,这些书中给出的例子往往是人为的,以至于完全无用——但这并不完全是书的错。

指向对象的指针的容器(如列表或向量)可能是多态性最典型的情况。 当代码的一部分必须注册一个对象以供代码的另一部分稍后使用,并且该对象不仅具有不同的数据而且具有不同的行为时,多态性可能会有所帮助。

多态性最有用的功能之一在于它如何支持向现有代码添加新类型,这些类型在设计原始代码时没有预见到。 因此,多态性通常可能更多地是维护实践的问题,而不是逻辑概念的问题。

在许多实质性程序中,根本不需要多态性,而在少于 2000 行的程序中,它很少需要或有帮助。 多态性解决了在10,000行或更长的程序中往往出现的实际设计问题 - 这正是为什么通常给出的多态性示例往往如此无用地做作的原因。 在编写一个足够大的程序之前,真的很难看到多态性的必要性。