在简单的例子中,在c ++中使用多态性有什么好处?

时间:2012-06-29 15:17:39

标签: c++ polymorphism

我有简单的程序,显示多态性。问题:在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 个答案:

答案 0 :(得分:3)

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

e.g:

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

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

答案 1 :(得分:2)

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

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

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

因此,简而言之,多态性可以帮助您实现可以独立实现程序的一部分而无需了解从属实现的内部细节的情况,但只能了解接口。

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

希望这会有所帮助..

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

但是,确实会出现使用多态的明确理由。众所周知,大多数这样的理由很难在几个段落中得到充分的解释 - 而且在太多的编程书籍中出了名的很难解释。令人遗憾的是,在这些书中给出的例子往往被设计到完全没用的地步 - 但这并不完全是书籍的错误。

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

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

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