如何在c++中用引用替换指针



"我相信有几十个问题都有相同的标题。其中许多是重复的。我的也可能是复制品,但我找不到。所以我尽量把它写得简洁、简短。"

我有一个这样的层次结构:

class Shape {
public:
   virtual void virtualfunc()  { std::cout << "In shapen"; }
};
class Circle: public Shape {
public:
   void virtualfunc()  { std::cout << "In Circlen"; };
};

,当我在指针的帮助下使用这些类时,函数会像我期望的那样被调用:

int main() {
   Shape shape_instance;
   Shape* ref_shape = &shape_instance ;
   Circle circle_instance;
   Circle* ref_circle = &circle_instance;
   ref_shape = dynamic_cast<Shape*> (ref_circle);
   ref_shape->virtualfunc();
}

这里程序调用派生类的virtualfunc(),结果自然是:In Circle

现在,我想去掉指针,用引用代替,得到相同的结果。所以我对main()做了一些琐碎的修改,看起来像这样:

int main() {
   Shape shape_instance;
   Shape& ref_shape = shape_instance;
   Circle circle_instance;
   Circle& ref_circle = circle_instance;
   ref_shape = dynamic_cast<Shape&>(ref_circle);
   ref_shape.virtualfunc();
}
但是这一次,程序调用了基类的virtualfunc(),结果是:In Shape

如果你让我知道我缺少的引用的哪个概念以及如何更改main()中的引用以获得我在指针版本中得到的结果,我将不胜感激。

谢谢

引用不能重置。一旦在初始化中初始化引用,它就会成为被引用对象的别名,并且无法与之区分。后一个赋值:

ref_shape = dynamic_cast<Shape&>(ref_circle);

的意思是:

shape_instance = dynamic_cast<Shape&>(ref_circle);

另一方面,您可以将一个新的引用绑定到对象(并且不需要dynamic_cast,因为从派生引用到基引用的转换是隐式的):

Shape & another_ref = ref_circle;
another_ref.virtualfunc();          // Dispatches to Circle::virtualfunc

这就是你的Circle变成Shape的地方。

ref_shape = dynamic_cast<Shape&>(ref_circle);
//        ^ here
ref_shape.virtualfunc();

ref_shape已经被定义为shape_instance的引用。

你是在而不是复制引用本身,因为引用不能被重新分配。您正在将实际对象复制到Shape对象。它被存储在shape_instance .

您可以通过尝试下面的代码来验证。它将打印In Circle

dynamic_cast<Shape&>(ref_circle).virtualfunc();

你应该这样做:

#include <iostream>
 class Shape {
  public:
   virtual void virtualfunc()  { std::cout << "In shapen"; }
 };
 class Circle: public Shape {
   public:
   void virtualfunc()  { std::cout << "In Circlen"; };
 };
 int main() {
    Shape shape_instance;
    //Shape& ref_shape = shape_instance;
    Circle circle_instance;
    Circle& ref_circle = circle_instance;
    Shape& ref_shape = dynamic_cast<Shape&>(ref_circle);
    ref_shape.virtualfunc();
}

如您所愿,它以圆圈形式输出

如果我正确理解你想要实现/显示的内容(即动态虚拟函数绑定),也许这段代码会有所帮助:

#include <iostream>
using namespace std;
class Shape {
  public:
    virtual void virtualfunc()  { std::cout << "In shapen"; }
};
class Circle: public Shape {
  public:
    void virtualfunc()  { std::cout << "In Circlen"; };
};
int main() {
  Circle circle_instance;
  // don't care what kind of Shape
  Shape &someShape = circle_instance;
  someShape.virtualfunc();
}

这里可以看到,someShape可以绑定到Shape或任何派生类,虚函数将在实际的动态类型上调用。这将打印In Circle。证明:http://ideone.com/A1UvrR

不需要dynamic_cast

相关内容

最新更新