gpt4 book ai didi

c++ - 指向基类的指针和指向派生对象的指针的内存布局差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:36 25 4
gpt4 key购买 nike

如果我有以下类(class):

class A
{
public:
A(int val) : m_valA(val) {}

private:
int m_valA;
};

class B : public A
{
public:
B(int val) : A(0), m_valB(val) {}

private:
int m_valB;
};


B* pb = new B;

如果我有一个接受 A* 的函数,例如:

void func(A* pVal) {}

并且pb传递给了这个函数,那么在底层内存布局方面,pval(在函数中)和pb指针有什么区别呢?

指针不是指向对象的开头吗?在这种情况下,这两个指针将如何不同?

最佳答案

Doesn't a pointer point to the beginning of the object? In which case how will the two pointers be different?

如果将指向 B 对象的指针传递给 func(A* pVal),则在 func() 实现中 pVal 指针将指向 B 对象的 A 子对象部分。未指定它们是否位于同一位置(尽管对于您示例中的简单继承情况,几乎可以肯定)。

如果 A 子对象实际上处于不同的偏移量(例如,如果涉及多重继承,则可能需要这种情况),那么编译器将自动进行适当的调整它编译调用。编译器可以这样做,因为在调用站点它知道它正在处理 B* 并且需要将其转换为 A* 以传递给 func() 。这是一个安全且正常的转换,因为 B 公开继承自 A

关于c++ - 指向基类的指针和指向派生对象的指针的内存布局差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6943892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com