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

时间:2010-10-01 00:30:19

标签: c++ reference polymorphism

我总是想到必须使用指针来实现多态性。使用规范示例:

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);

3 个答案:

答案 0 :(得分:46)

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

答案 1 :(得分:10)

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

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

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

干杯&amp;第h。,

答案 2 :(得分:0)

指针也有其他方面的帮助。就像传递一个字符串并在函数中接受它作为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--;
}
}

使用引用编写用于字符串操作的代码并不那么简单。