c++ - 动态转换在从父级向下转换到子级时失败

标签 c++ casting dynamic-cast downcast

我有以下父子简单类:

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/

相关文章:

c++ - 使用 dynamic_cast 进行运行时类型识别

C++动态向下转换为具有模板模板参数的类模板是类模板或别名模板

typescript - 将对象映射到其他对象的简洁方法?

c++ - 汉明立方体顶点上的查询点

c++ - 指针数组和按引用调用

c++ - ESP 调用约定问题 C++

iphone - 在 Objective-C 中测试类的类型

在不同的体系结构上转换指针类型

C++:从一个基类模板到另一个基类模板的动态转换

c++ - Kernel32.dll 头信息