今天面试时被问到C++的子类与父类有同名变量时,C++会如何处理。
示例代码如下:
class A {
public:
int a;
A(){ a=0; }
};
class B:public A{
public:
int a;
B(){ a=0;}
};
int main() {
A* a=new B();
a->a=1;
B* b=(B*)a;
b->a=4;
}
C++的类的内存布局是先父类,再子类。
所以当B类中既有A的a也有B的a。
内存布局如下:
(gdb) p *b
$6 = {<A> = {a = 1}, a = 0}
(gdb) x/2x b
0x761a50: 0x00000001 0x00000000
当运行完a->a=1
时,A类中的a被置为1,存放在B类的a前。
如果想要在B类中调用A的a,操作方法如下:
b->A::a=7;
从汇编代码也可以看出差别:
// a->a=1;
mov rax, QWORD PTR [rbp-24]
mov DWORD PTR [rax], 1
// b->a=4;
mov rax, QWORD PTR [rbp-32]
mov DWORD PTR [rax+4], 4
地址偏移量在编译时就确定的。
转载:https://blog.csdn.net/zhangpeterx/article/details/101314392
查看评论