测试源码:
//测试派生类的构造函数的调用顺序何时调用
//Fedora20 gcc version=4.8.2
#include
using namespace std;
class base
{
public:
base()
{
cout<<”base created!”<<endl;
}
~base()
{
cout<<”base destroyed!”<<endl;
}
};
//公有继承
class A:public base
{
public:
A()
{
cout<<”A created!”<<endl;
}
~A()
{
cout<<”A destroyed!”<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<”B created!”<<endl;
}
~B()
{
cout<<”B destroyed!”<<endl;
}
};
测试代码:
int main()
{
A a;
A *a1;
cout<<”可以看到a1并没有调用基类的构造函数”<<endl;
A *a2=new A;
//只有在new 一个对象的时候才会调用基类的构造函数
cout<<”可以看到a3也并没有调用基类的构造函数”<<endl;
A *a3=&a;
B b;
}
输出为: 可以看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。 而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数,这是因为对象创建时候对象存放在堆栈中的原因。(new 的对象虽然是存在堆中,但是在堆栈中依然存放其堆中的地址,因此,析构的时候也是一样) 那么,创建其对象的数组时:A a[2],是否会调用其构造函数呢,这是肯定的,如下 测试代码:(仅修改main里面的内容)
int main()
{
A a[2];
}
结果为: 那如果是创建指向其对象的数组呢? A *a[2];
int main()
{
A *a[2];
}
答案显然是不会。 那么这个时候,如果A里面有一个函数fun(),令a[0]->fun()会发生什么情况呢?
void fun()
{
cout<<”A fun run”<<endl;
}
测试代码:
int main()
{
A *a[2];
a[0]->fun();
}
结果为: 可以看到,虽然没有调用构造函数,但是依然可以使其执行其成员函数呢! 那么,如果A有一个public int i;的变量,a[0]->i,会是什么?
class A:public base
{
public:
int i;
A()
{
cout<<”A created!”<<endl;
}
~A()
{
cout<<”A destroyed!”<<endl;
}
void fun()
{
cout<<”A fun run”<<endl;
}
};
测试代码:
int main()
{
A *a[2];
a[0]->fun();
cout<<endl<<a[0]->i<<endl;
}
结果: 可以看到,a[0]->i指向一个不确定的值!如果指定static const int i=1;那么,指向的必然就是1了。 今天就先测试这些最简单的吧,有点累了,多继承,虚基层明天再测试。 突然发现好像上次UC笔试做这道题的时候,析构的顺序似乎弄错了,郁闷。 还没收到面试信息,也还没有受到笔试挂了的通知,也不知道是个什么情况啊。 继续努力吧。 有时候,细节真的很重要! —————————————————————————————————————————————————— //写的错误或者不好的地方请多多指导,可以在下面留言或者给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。 转载请注明出处:https://www.royalchen.com/ author:royalchen Email:royalchen@royalchen.com ———————————————————————————————————————————————————
- 本文作者: royalchen
- 本文链接: http://www.royalchen.com/2016/02/24/c学习笔记4,派生类的构造函数与析构函数的调用/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!