c++学习笔记4,调用派生类的顺序构造和析构函数(一个)
测试源代码:
//測试派生类的构造函数的调用顺序何时调用
//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;
}
输出为:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
能够看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。
而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数。这是由于对象创建时候对象存放在堆栈中的原因。(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笔试做这道题的时候。析构的顺序似乎弄错了,郁闷。
还没收到面试信息。也还没有受到笔试挂了的通知,也不知道是个什么情况啊。
保持。
有时,细节很重要!
c++学习笔记4,调用派生类的顺序构造和析构函数(一个)的更多相关文章
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace ...
- 【c# 学习笔记】阻止派生类重写虚成员
使用sealed 关键字可以防止一个类被其他类继承.同样,也可以使用sealed关键字来阻止派生类重写虚成员.如,我们希望Horse的继承类不再具有扩展Voice方法的行为.(上一章链接:https: ...
- Android(java)学习笔记136:Java类初始化顺序
Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化( ...
- Android(java)学习笔记78:Java类初始化顺序
1. Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: (1)静态变量 (2)静态初始化块 (3)变量 (4)初始化块 (5)构造器 由此得出Java继承类初始化顺序结论: (1)继 ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- AJPFX学习笔记JavaAPI之String类
学习笔记JavaAPI之String类 [size=10.5000pt]一.所属包java.lang.String,没有子类.特点:一旦被初始化就不可以被改变. 创建类对象的两种方式: String ...
随机推荐
- 开源yYmVc项目 v 0.2 版本号介绍
项目地址:https://code.csdn.net/hacke2/yymvc 本版本号主要实现下面几点功能: 1.框架入口基于过滤器统一实现,action后缀动态配置 2.action配置模仿str ...
- 【MySQL案例】HA: GTID_MODE配置不一致
1.1.1. HA: GTID_MODE配置不一致 [环境描写叙述] msyql5.6.14 [报错信息] 初始状态Master和Slave都开启了enforce-gtid-consistency和g ...
- wamp环境中mysql更改root密码
集成的wamp环境命令不好使,在phpmyadmin中更改密码 权限——root用户修改,执行 然后,你会发现你不能用phpmyadmin登陆了修改下phpmyadmin里面对应的密码就可以了将php ...
- swfupload组件后台获取中文文件名称乱码的问题解决
问题描写叙述:用swfupload上传文件,含有中文名称的文件上传会报错,我用的是获取FileItem对象,用FileItem对象的getName()方法获取文件名会乱码,试着用request. ...
- Linux温馨提示1--安装U板块和Windwos划分
一.安装U盘 现在我用Ubuntu12.04在插入U光盘将被直接安装到/media/下, 10:33linc@Linc-Ubuntu:linc$ df -h Filesystem Size Used ...
- Bigcommerce: 给已完成购买的客户发送一封产品评论邮件,让客户直接进行产品评论
需求说明:进入后台的Order列表,更新订单状态:Awaiting Pickup后,就会给客户发送一封希望他们能进行评论的邮件.在邮件中展示该订单下的所有产品,每个产品都有一个评论的跳转链接,点击后直 ...
- loj1201(最大独立集)
传送门:A Perfect Murder 题意:有一群苍蝇,之间有一些是朋友关系,如果杀了一只苍蝇,那么它的朋友们都会有警惕性,再也杀不了这些朋友了,问最多能杀多少只苍蝇. 分析:根据朋友性连边,最多 ...
- python手记(47)
#!/usr/bin/env python # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl #code:myhaspl@qq.com imp ...
- 命令含执行JAVA程序
1.当类没有包名时 javac Test.java java Test 2.当有包名情况下 package com.me.Test; javac -d . Test.java java com.m ...
- RequireJS学习资料
RequireJS学习资料汇总 入门系列 [1]阮一峰 RequireJS用法 [2]RequireJS入门指南 文档系列 [1]RequireJS中文文档 [2]RequireJS英文文档 代码 ...