我有以下父子简单类:
class BoundBases{
public:
virtual ~BoundBases() { }
};
// Rectangular Bounds for tree
class RectBounds : public BoundBases{
public:
// x, y center point
double x, y;
double w, h;
~RectBounds(){ }
// (_x, _y): center of rectangle bound. (_w, _h): width and height
RectBounds(double _x, double _y, double _w, double _h){
x = _x;
y = _y;
w = _w;
h = _h;
}
//... more functions
};
我还有如下函数结构:
void MyClass::init( BoundBases &bounds, std::vector<int> &colsPartitioned)
{
printf("init - new\n");
BoundBases * bPtr = &bounds;
RectBounds * rBounds = dynamic_cast<RectBounds *>(bPtr);
if(rBounds){
// do something
}else{
throw runtime_error("dynamic cast fail");
}
}
即使我使用 RectBounds 类型作为参数调用函数,动态转换仍然失败。这是什么原因?
已修复:
调用init的函数传值给BoundBases,如下:
MyClass2::MyClass2( BoundBases boundBases, std::vector<int> colsPartitioned) { // creates new table
// set up partition
partScheme_ -> setColsPartitioned(colsPartitioned);
partScheme_ -> setBoundBases(boundBases);
partScheme_ -> init(boundBases, colsPartitioned);
}
我将签名更改为通过引用传递并且有效。 (&boundBases)。有人可以解释为什么会这样吗?我是 C/C++ 的新手。
最佳答案
你需要在这里引用,因为 dynamic_cast 只有在你的变量的实际类型是 RectBounds 类型时才有效,比如:
BoundBases* dummy = new Rectbound();
这里可以向下转型,因为真正的类型是Rectbound,所以会起作用。 如果您按值传递它,它将仅创建对象 BoundBase 部分的拷贝,从而丢失有关您的真实类型的信息。
此问题称为 slicing
关于c++ - 动态转换在从父级向下转换到子级时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22021030/