Parent()
{
cout << "Parent() : " << "&mi = " << &mi << endl;
} //确认成员变量地址,定位类Parent
};
class Child : public Parent
{
public:
int mi;
Child()
{
cout << "Child() : " << "&mi = " << &mi << endl;
} //确认成员变量地址,定位类Child
};
int main()
{
Child c;
c.mi = 100;
c.Parent::mi = 1000; //作用域分辨符,和命名空间有点像
cout << "&c.mi = " << &c.mi << endl; //查看是子类的
cout << "c.mi = " << c.mi << endl;
cout << "&c.Parent::mi = " << &c.Parent::mi << endl; //查看的是父类的
cout << "c.Parent::mi = " << c.Parent::mi << endl;
return 0;
}
结果:
Parent() : &mi = 0xbfb99188
Child() : &mi = 0xbfb918c
&c.mi = 0xbfb9918c //证明调用的子类mi
c.mi = 100 //打印子类中的mi
&c.Parent::mi = 0xbfb99188 //证明调用的子类继承自父类的mi
c.Parent::mi = 1000 //打印父类中的mi
分析:
当子类和父类有同名成员时,父类成员被子类覆盖,但是它依然存在子类中。
子类中的mi和父类中mi地址相差4,父类Parent只有int类型mi,类Parent占用4字节,子类Child也只有同名int类型mi,占用4字节。在栈上分配内存时,会被连续分配。
类的大小并不包含成员