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笔试做这道题的时候。析构的顺序似乎弄错了,郁闷。

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

保持。

有时,细节很重要!

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • inputstreamreader和inputstream_FileInputStream

    inputstreamreader和inputstream_FileInputStreamInputStreamReader类:java.io.InputStreamReaderextendsReaderInputStreamReader:是字节流通向字符流的桥梁:他使用指定的charset读取字节并将其解码为字符。(解码:把看不懂的变为能看懂的)继承自父类的共性成员方法:intread()读取单个字符并返回intread(char[]cbuf)一次读取多个字符,经字符读入数组中voidclose()关闭该流并释放与之关联的所有资源构造方

  • golang 永久激活破解方法

    golang 永久激活破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • TD-SCDMA/GSM是啥意思,移动,联通,电信的4G网络制式

    TD-SCDMA/GSM是啥意思,移动,联通,电信的4G网络制式中国3g网络共3种:一是联通的wcdma二是电信的cdma2000这前两者都是外国也支持的网络,也就是说如果你有这种网络制式的手机,软件解锁后,拿到外国直接上外国卡就能正常使用的!

  • 控件anchor和dock属性_控件的常用属性

    控件anchor和dock属性_控件的常用属性在设计窗体时,这两个属性特别有用,如果用户认为改变窗口的大小并不容易,应确保窗口看起来显示的不是那么乱,并编写很多代码来实现这个效果,许多程序解决这个问题都是禁止给窗口重新设置大小这显然是解决问题的最简单的方法,但不是最好的方法,因此引入了Anchor和Dock属性。1、Anchor属性用于指定在用户重新设置窗口的大小时控件应该如何响应,可以指定如果控件重新设置了大小,就根据控件的边界去锁

  • windows无法打开图片显示内存不足_Windows图片和传真查看器

    windows无法打开图片显示内存不足_Windows图片和传真查看器解决Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足解决Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足问题问题分析解决办法一解决办法二解决Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足系统:Win10问题最近在使用Windows照片查看器打开一个jpg文件的时候异常Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足。请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满)

    2022年10月26日
  • Java集合中List,Set以及Map等集合体系详解(史上最全)

    概述:ListSetMap都是接口,前两个继承至Collection接口,Map为独立接口Set下有HashSet,LinkedHashSet,TreeSetList下有ArrayList,Vector,LinkedListMap下有Hashtable,LinkedHashMap,HashMap,TreeMap还有Collection接口下还有个Queue接口,有Priority…

发表回复

您的电子邮箱地址不会被公开。

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