如果我有以下课程:
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指针之间有什么区别?
指针不指向对象的开头吗?在这种情况下,两个指针将如何不同?
答案 0 :(得分:1)
指针不指向对象的开头吗?在这种情况下,两个指针将如何不同?
如果您将B
对象的指针传递给func(A* pVal)
,那么在func()
实现中pVal
指针将指向A
子B
对象的对象部分。未指明它们是否位于同一位置(尽管对于简单的继承情况,例如,几乎可以肯定的是)。
如果A
子对象实际上处于不同的偏移量(例如,如果涉及多重继承,则可能需要这种情况),编译器将在编译时自动进行适当的调整。呼叫。编译器可以这样做,因为在调用站点它知道它正在处理B*
并需要将其转换为A*
以传递给func()
。这是一种安全而正常的转换,因为B
公开继承自A
。
答案 1 :(得分:0)
void func(A* pVal) {}
pb
升级为pVal
。它指向基类子对象。但是,如果它是一个多态类,它会调用重写的派生类方法if。
pb
可以根据访问级别访问两个子对象成员。但是,pVal
仅访问基类子对象成员。但是,如果基类是多态的,则可以运行时多态。