当类型为shared_ptr<base_type>时,在"局部变量"窗口中将本地作为派生类型查看



当我有一个派生类型的shared_ptr,但shared_ptr的类型是基类型时,我在Visual Studio的Locals窗口中只能看到基类型的成员(就像对象被切片一样)。

下面是一个非常小的程序,显示了我看到的问题。如果在构造shared_ptr之后设置断点,并且在Locals窗口中查看变量sp,则无法看到dvalue

有办法看到这个吗?也许我被托管代码宠坏了。。。

#include <memory>
struct Base {
    int ivalue;
};
struct Derived : public Base {
    double dvalue;
};
int main() {
    Derived d;
    d.ivalue = 42;
    d.dvalue = 3.14;
    auto sp = std::make_shared<Base>(d);
    // break here
    return 0;
}

std:make_shared根据您提供的类型创建一个新对象,因此在您的代码中,它创建一个"Base"对象并指向它,而不是指向实例"d"。

您可以将复制构造函数添加到结构中,并在其中放置break指针,然后查看哪一个被调用:

struct Base {
    int ivalue;
    Base(const Base& b)
    {
        ivalue  = b.ivalue;
    }
};
struct Derived : public Base {
    double dvalue;
    Derived(const Derived& b)
    {
        ivalue  = b.ivalue;
        dvalue = b.dvalue;
    }
};

当你想在Derived对象中看到值时,你可以在shared_ptr中获得"Base"指针的原始地址,只需将其添加到观察窗口:

(Derived*))0x45467890

最新更新