-4

我有一个显示多态性的简单程序。问题:在简单调用 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;
}

感谢你的回答。

4

4 回答 4

3

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

例如:

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

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

于 2012-06-29T15:24:36.020 回答
2

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

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

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

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

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

希望这可以帮助..

于 2012-06-29T15:33:05.080 回答
0

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

于 2012-06-29T15:32:39.833 回答
0

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

然而,确实出现了使用多态性的明确理由。众所周知,大多数这样的原因很难在几段中充分解释——而且在太多的编程书籍中也很难解释清楚。令人遗憾的是,这些书中给出的例子往往被人为设计到完全无用的地步——但这并不完全是这些书的错。

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

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

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

于 2012-06-29T15:37:56.257 回答