当我有一个派生类型的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