c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

测试源代码:

//測试派生类的构造函数的调用顺序何时调用
//Fedora20 gcc version=4.8.2
#include <iostream>
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;
	<span style="color:#ff0000;">A *a1;</span>
	cout<<"能够看到a1并没有调用基类的构造函数"<<endl;
	<span style="color:#ff0000;">A *a2=new A;</span>
	//仅仅有在new 一个对象的时候才会调用基类的构造函数
	cout<<"能够看到a3也并没有调用基类的构造函数"<<endl;
	A *a3=&a;
       B b;
}

输出为:

c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

能够看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。

而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数。这是由于对象创建时候对象存放在堆栈中的原因。(new 的对象尽管是存在堆中,可是在堆栈中依旧存放其堆中的地址,因此。析构的时候也是一样)


那么,创建其对象的数组时:A a[2],是否会调用其构造函数呢。这是肯定的。例如以下

測试代码:(仅改动main里面的内容)

int main()
{
	 A a[2];
}

结果为:

c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

那假设是创建指向其对象的数组呢? 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();
}

结果为:
c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

能够看到,尽管没有调用构造函数,可是依旧能够使其运行其成员函数呢!


那么,假设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;
}

结果:

c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

能够看到,a[0]->i指向一个不确定的值。假设指定static const int i=1;那么,指向的必定就是1了。

今天就先測试这些最简单的吧,有点累了。多继承。虚基层明天再測试。

突然发现好像上次UC笔试做这道题的时候。析构的顺序似乎弄错了,郁闷。

还没收到面试信息。也还没有受到笔试挂了的通知,也不知道是个什么情况啊。

保持。

有时,细节很重要!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117722.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月1日 下午12:00
下一篇 2022年1月1日 下午1:00


相关推荐

  • 什么是IP地址、IP协议?[通俗易懂]

    什么是IP地址?IP地址协议互联网协议地址(英语:InternetProtocolAddress,又译为网际协议地址),缩写为IP地址(英语:IPAddress),是分配给用户上网使用的网际协议(英语:InternetProtocol,IP)的设备的数字标签。网络互联网络互连设备,如以太网、分组交换网等,它们相互之间不能互通,不能互通的主要原因是因为它们所传送数据的基本单元(技术…

    2022年4月10日
    79
  • html实战-制作静态网页「建议收藏」

    html实战-制作静态网页「建议收藏」教程视频:http://edu.csdn.net/course/detail/535 从42开始制作的网页:http://www.cnos.co/整体思路:先布局再CSS控制骨架搭好了,初始化样式,后再弄CSS样式。注意:将CSS的样式导入到外部样式表时,要注意图片的位置,以及对外部样式表的引入  1、头部的背景图片的高度128px来自素材的图片高,容器的宽度大

    2025年9月15日
    8
  • c++入门教程–-12作用域

    c++入门教程–-12作用域

    2021年3月12日
    196
  • Langchain入门到精通0x04:大模型怎么记忆?

    Langchain入门到精通0x04:大模型怎么记忆?

    2026年3月12日
    2
  • 树莓派3B+ 引脚图说明

    树莓派3B+ 引脚图说明如上图所示,我们可以很清楚的看到各个引脚的功能。例如我们想使用pwm引脚来控制舵机,则我们可以考虑使用其中的BCM18(PWM0)和BCM13(PWM1)。在使用wiringPi库时,我们定义的引脚即BCM引脚,例如:pwmPinV=18pwmPinH=13…

    2022年6月25日
    51
  • 基于51单片机的红绿灯设计

    基于51单片机的红绿灯设计寒假项目最后一个,基于STC/AT89C51的红路灯设计实现十效果具体为:南北通行42秒,南北闪烁3秒,南北黄灯4秒,禁止通行1秒,东西黄灯4秒,东西通行27秒,东西闪烁3秒,东西黄灯4秒。同时具备特殊放行模式:南北自由通行;东西自由通行;全部禁行。所有时间可以修改。貌似和平时的红路灯不一样,但是由于想凑齐八个状态,就整了这神奇的控制步骤。黄灯多,安全第一!!原理图:本来是想设计一个蓝牙或者……

    2025年5月24日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号