динамическое приведение не удается при переходе от родительского к дочернему

У меня есть следующие родительские дочерние простые классы:

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 ++.

0

Решение

Здесь вам нужна ссылка, потому что dynamic_cast будет работать только в том случае, если реальный тип вашей переменной имеет тип RectBounds, например:

BoundBases* dummy = new Rectbound();

Вы можете использовать здесь, потому что реальный тип — Rectbound, поэтому он будет работать.
Если вы передадите его по значению, он создаст копию только части BoundBase вашего объекта, потеряв информацию о вашем реальном типе.

Эта проблема известна как нарезка

3

Другие решения

Я не уверен, почему вы удивлены таким поведением. BoundBases передается по значению просто BoundBases, Настолько динамический, что ребенок не может сделать это RectBounds, Это именно то, что должен делать dynamic_cast.

Если бы он работал по-другому: как бы это определить, например, что? х, у, если это только дано BoundBases, Это не определено.

0

По вопросам рекламы [email protected]