指向base的指针和指向派生对象的指针的内存布局的差异

时间:2011-08-04 15:10:38

标签: c++ inheritance

如果我有以下课程:

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指针之间有什么区别?

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

2 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:0)

void func(A* pVal) {}

pb升级为pVal。它指向基类子对象。但是,如果它是一个多态类,它会调用重写的派生类方法if。

pb可以根据访问级别访问两个子对象成员。但是,pVal仅访问基类子对象成员。但是,如果基类是多态的,则可以运行时多态。