昨天室友问了我一个c++基类和派生类的内存方面的问题,由于当时不能给出确切的答案,所以今天在VS上面一个个测试了一遍,今记录下来。
问题归结为如下代码:
class A
{
public:
A():a(0)
{
cout<<"this is A's contructor!"<<endl;
}
~A()
{
cout<<"this is A's destory"<<endl;
}
void fun()
{
cout<<"this is A::fun()"<<endl;
}
virtual void vfun()
{
cout<<"this is A::vfun()"<<endl;
}
public:
int a;
};
class B:public A
{
public:
B():a(5)
{
cout<<"this is B's contructor!"<<endl;
}
~B()
{
cout<<"this is B's destory"<<endl;
}
virtual void vfun()
{
cout<<"this is B::vfun()"<<endl;
}
void fun()
{
cout<<"this is B::fun()"<<endl;
}
int a;
};
<div>int main()
{
B b;
A *p=&b;
p->fun();
p->vfun();
p->a=2; //通过p改变A中a的值
cout<<b.a<<endl; //b.a=5
return 0;
}
</div>
问题:通过上面的p指针对成员变量a(类A、B中都有a)进行赋值会不会改变B中的a的值?
解答:因为B继承自A,所以当实例化一个B对象b时,也会构造基类a的部分(我们可以通过成员对象访问符明确指定要访问的对象),因为我们用基类的指针去访问指向派生类的对象,所以会出现对象切割(编译器只会识别到基类的成员对象),所以p->a=2修改的知识p->A::a的值(基类的成员变量a),而b对象的a值依然没有变(B::a==5,A::a=2);