У меня есть следующие родительские дочерние простые классы:
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 вашего объекта, потеряв информацию о вашем реальном типе.
Эта проблема известна как нарезка
Я не уверен, почему вы удивлены таким поведением. BoundBases
передается по значению просто BoundBases
, Настолько динамический, что ребенок не может сделать это RectBounds
, Это именно то, что должен делать dynamic_cast.
Если бы он работал по-другому: как бы это определить, например, что? х, у, если это только дано BoundBases
, Это не определено.