“我确信有几十个问题都有相同的标题。其中很多都是重复的。我的也可能是重复的,但我找不到任何问题。所以我试着让它变得非常简洁,简洁。 “
我有这样的层次结构:
class Shape {
public:
virtual void virtualfunc() { std::cout << "In shape\n"; }
};
class Circle: public Shape {
public:
void virtualfunc() { std::cout << "In Circle\n"; };
};
当我在指针的帮助下使用类时,函数按照我的预期调用:
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()中的引用以获得指针版本中的结果,我感谢您。
谢谢
答案 0 :(得分:18)
无法重新引用参考文献。在初始化中初始化引用后,它将成为引用对象的别名,无法与其区分。后一项任务:
ref_shape = dynamic_cast<Shape&>(ref_circle);
真的意味着:
shape_instance = dynamic_cast<Shape&>(ref_circle);
另一方面,您可以绑定对该对象的新引用(并且您不需要dynamic_cast
,因为从引用到引用到base的转换是隐式的):
Shape & another_ref = ref_circle;
another_ref.virtualfunc(); // Dispatches to Circle::virtualfunc
答案 1 :(得分:6)
这是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();
答案 2 :(得分:4)
您应该执行以下操作:
#include <iostream>
class Shape {
public:
virtual void virtualfunc() { std::cout << "In shape\n"; }
};
class Circle: public Shape {
public:
void virtualfunc() { std::cout << "In Circle\n"; };
};
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();
}
按预期输出圆圈。
答案 3 :(得分:1)
如果我理解你正在尝试实现/显示的内容(即动态虚函数绑定),也许这段代码会有所帮助:
#include <iostream>
using namespace std;
class Shape {
public:
virtual void virtualfunc() { std::cout << "In shape\n"; }
};
class Circle: public Shape {
public:
void virtualfunc() { std::cout << "In Circle\n"; };
};
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