关于多态性的引用和指针是否相同?

pm1*_*100 41 c++ polymorphism reference

我一直认为必须使用指针进行多态性.使用规范示例:

DrawEngine::render(Shape *shape)
{
    shape->draw();
    shape->visible(true);
}
Run Code Online (Sandbox Code Playgroud)

并将指针传递给各种Shape派生类.它与引用一样吗?

DrawEngine::render(Shape &shape)
{
     shape.draw();
     shape.visible(true);
}
Run Code Online (Sandbox Code Playgroud)

甚至有效:

engine.render(myTriangle); // myTriangle instance of class derived from Shape
Run Code Online (Sandbox Code Playgroud)

如果这样可行,这两种情况之间是否存在差异?我试图在Stroustrup中找到信息,但我一无所获.

我重新打开了这个,因为我想再探索一下.

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

我可以去吗

Rhomboid & r = dynamic_cast<Rhomboid &>(shape);
Run Code Online (Sandbox Code Playgroud)

如果演员表失败会怎么样?这有什么不同吗?

Rhomboid * r = dynamic_cast<Rhomboid*>(&shape);
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 46

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

  • @Etienne C++只是机器代码上的语法糖:-). (6认同)
  • @ pm100:直接,当然,但有不同的方面.例如,`dynamic_cast`将抛出异常而不是在错误的强制转换上返回null. (3认同)
  • @GMan:我认为`dynamic_cast`示例是指针和引用之间的基本区别:指针可以合法地为NULL,而引用则不能.正如我所读到的,问题的核心在于引用在虚拟表方面的行为是否相同.因此简短的回答. (3认同)
  • 我看到它的方式,引用似乎只是指针之上的语法糖. (2认同)

Che*_*Alf 10

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

一个原因是没有有效的空引用这样的东西.

可能另一个原因(但它可能只是一个无意中有用的紧急功能)是有时需要异常,有时需要易于检查的nullpointer,无论你有一个引用或指针,它需要在大多数是解除引用或地址操作符以获取所需的行为.

干杯&hth.,