【问题标题】:Are references and pointers equal with regards to polymorphism?关于多态性,引用和指针是否相等?
【发布时间】:2011-04-19 15:24:47
【问题描述】:

我一直认为必须使用指针来实现多态性。使用规范示例:

DrawEngine::render(Shape *shape)
{
    shape->draw();
    shape->visible(true);
}

并传入指向各种 Shape 派生类的指针。它与引用相同吗?

DrawEngine::render(Shape &shape)
{
     shape.draw();
     shape.visible(true);
}

这样做是否有效:

engine.render(myTriangle); // myTriangle instance of class derived from Shape

如果可行,这两种情况有什么区别吗?我试图在 Stroustrup 中查找信息,但一无所获。

我重新打开它是因为我想进一步探索。

所以至少有一个区别是dynamic_cast。对我来说,多态性包括使用 dynamic_cast。

我可以去吗

Rhomboid & r = dynamic_cast<Rhomboid &>(shape);

如果转换失败会发生什么?这有什么不同吗?

Rhomboid * r = dynamic_cast<Rhomboid*>(&shape);

【问题讨论】:

    标签: c++ reference polymorphism


    【解决方案1】:

    关于多态性,引用就像指针一样工作。

    【讨论】:

    • @pm100:直接,当然,但有不同的方面。例如,dynamic_cast 将抛出异常,而不是在错误转换时返回 null。
    • @GMan:我认为dynamic_cast 示例是指针和引用之间的基本区别:指针可以合法地为 NULL,而引用不能。正如我所读到的那样,问题的核心是引用在虚拟表方面的行为是否相同。因此,简短的回答。
    • 在我看来,引用似乎只是指针之上的语法糖。
    • @Etienne,这对于我遇到的每个编译器来说都是如此。但我很少出去。
    • @Etienne C++ 只是机器代码之上的语法糖 :-)。
    【解决方案2】:

    关于dynamic_cast,失败的强制转换会产生一个带有指针的空指针,并导致抛出带有引用的bad_cast (IIRC) 异常。

    一个原因是没有有效的空引用。

    可能另一个原因(但它可能只是一个无意中有用的紧急特性)是有时需要异常,有时需要易于检查的空指针,无论您手头是否有引用或指针最多需要一个解引用或地址操作符来获得你想要的行为。

    干杯,

    【讨论】:

      【解决方案3】:

      指针在其他方面也有帮助。就像传递一个字符串并将其作为函数中的 char* 参数接受一样。

      考虑在原地反转字符串的旧示例:

      void reversestring(char* myString)
      {
      int firstPos=0;
      int lastPos=myString.length - 1;
      while (firstPos < lastPos)
      {
        char temp=myString[firstPos];
        myString[firstPos]=myString[lastPos];
        myString[lastPos]=temp;
        firstPos++;
        lastPos--;
      }
      }
      

      使用引用编写这样的字符串操作代码不会那么简单。

      【讨论】:

      • myString.length?是 c++ 吗?
      • @TheLightSpark 如果myStringstd::string 将是有效的,但我相信它对于原始C 字符串是无效的。此外,length 应该是一个函数调用,但这是吹毛求疵。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 2014-06-17
      • 1970-01-01
      • 2018-11-16
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多