小言_互联网的博客

C++ 面试题:子类与父类同名变量

500人阅读  评论(0)

今天面试时被问到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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场