在某些情况下指针的地址是否会发生变化
Does the addresses of the pointers change under certain cases
如果我创建一个指针向量,其类型为某些已定义的 class 并将指针指向其中第一个继承对象类型的对象,那么指向下一个地址的指针将不会是由于前一个指向的继承 class 中存在新数据成员,因此更改为指向移位地址。
所以如果我定义了一个new类型的基class数组,然后放入一个驱动class类型的对象,编译器将如何处理开始的修改下一个指针的地址。不应该移动它或类似的东西以使一些字节可用于前一个字节。
如果您定义一个 std::vector<BaseClass>
,其中 BaseClass
是您的基础 class,然后将 DerivedClass
类型放入该向量中,其中 DerivedClass
是您的派生class,你会得到切片。这意味着派生 class 中的任何额外数据成员都将丢失。
因此,您通常要做的是定义一个 std::vector<BaseClass *>
,它是基 class 指针的向量。现在您可以将基础 class 指针和派生 class 指针放入向量中,并且没有切片。
您正在向量中存储指针。所有指针的大小都相同。
请注意,在现实世界中,您可能不会使用原始指针,而是使用某些版本的智能指针来减少内存泄漏的可能性(即忘记释放指针)。
如果我创建一个指针向量,其类型为某些已定义的 class 并将指针指向其中第一个继承对象类型的对象,那么指向下一个地址的指针将不会是由于前一个指向的继承 class 中存在新数据成员,因此更改为指向移位地址。
所以如果我定义了一个new类型的基class数组,然后放入一个驱动class类型的对象,编译器将如何处理开始的修改下一个指针的地址。不应该移动它或类似的东西以使一些字节可用于前一个字节。
如果您定义一个 std::vector<BaseClass>
,其中 BaseClass
是您的基础 class,然后将 DerivedClass
类型放入该向量中,其中 DerivedClass
是您的派生class,你会得到切片。这意味着派生 class 中的任何额外数据成员都将丢失。
因此,您通常要做的是定义一个 std::vector<BaseClass *>
,它是基 class 指针的向量。现在您可以将基础 class 指针和派生 class 指针放入向量中,并且没有切片。
您正在向量中存储指针。所有指针的大小都相同。
请注意,在现实世界中,您可能不会使用原始指针,而是使用某些版本的智能指针来减少内存泄漏的可能性(即忘记释放指针)。