Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c++;举个简单的例子?_C++_Polymorphism - Fatal编程技术网

C++ 在c++;举个简单的例子?

C++ 在c++;举个简单的例子?,c++,polymorphism,C++,Polymorphism,我有一个显示多态性的简单程序。问题:在对dr1.test()和dr2.test()的简单调用上面使用bs->test()有什么好处 #包括 使用名称空间std; 阶级基础 { 公众: 虚空测试()=0; }; 第1类:公共基础 { 公众: void test(){cout在您的示例中,使用多态性没有任何附加值。当您不再知道派生类是什么时,多态性会增加附加值 e、 g: 编辑: 当然,还有一个附加值:表明多态性确实有效。在这种特殊情况下,使用多态性可能有一个缺点。调用dr1.test()将静态解析

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

#包括
使用名称空间std;
阶级基础
{
公众:
虚空测试()=0;
};
第1类:公共基础
{
公众:

void test(){cout在您的示例中,使用多态性没有任何附加值。当您不再知道派生类是什么时,多态性会增加附加值

e、 g:

编辑:

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

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

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

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

你会在各行各业中看到这种模式。你知道外出就餐的合同。查看菜单,点食物,付钱,然后回来(基本类方法)。不需要知道他们如何烹饪,如何制作菜单等

因此,简言之,多态性可以帮助您实现这样的情况:您可以独立地实现程序的一部分,而不必知道依赖实现的内部细节,而只需要知道接口

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


希望这有帮助。

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

然而,使用多态性的确切原因确实出现了。众所周知,大多数这样的原因很难在几个段落中充分解释,而且在太多的编程书籍中解释得很糟糕。遗憾的是,这些书籍中给出的示例往往被人为地设计到完全无用的地步——但这并不完全是这些书籍的错误t

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

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


在许多实质性的程序中,多态性根本不需要,在少于2000行的程序中,多态性很少需要或有用。多态性解决了在10000行或更长的程序中经常出现的实际设计问题,这正是多态性的典型例子往往是如此无用的设计真的很难看到多态性的必要性,直到一个人编写了足够大的程序。

你问多态性的好处是什么(只是想仔细检查)这个简单的例子。这是一个关于C++程序员的访谈问题,使用BS>Test.()的好处是什么?,因为我们只需要调用函数dr1.test(),dr2.test()有什么不同吗?我们如何告诉你多态性对一个无用的代码的好处?你假设多态性是有益的,在这里或一般;谁说假设是有效的?这是一个完美的问题。任何人开始学习C++都会有这个问题。它不是模糊的。它是一个清晰、精确的O。事实上,它挑战了句子中的每一个词“这个问题是模糊的、模糊的、不完整的、过于宽泛的或修辞性的,并且不能以其当前的形式得到合理的回答”。我从来没有理解过仅仅因为这个问题而轻视真实问题的做法
#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();
}