0

当我有shared_ptr一个派生类型,但 shared_ptr 的类型是基类型时,我在 Visual Studio 的 Locals 窗口中除了基类型的成员之外什么都看不到(就好像对象被切片一样)。

下面是一个非常小的程序,显示了我看到的问题。如果在shared_ptr构造后设置断点,并且sp在 Locals 窗口中查看变量,则看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;
}
4

1 回答 1

0

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

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

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;

    }
};

当您想查看派生对象中的值时,您可以在 shared_ptr 中获取“基”指针的原始地址,只需将其添加到监视窗口:

(Derived*))0x45467890
于 2014-04-10T18:07:44.003 回答