C++类的继承中构造函数和析构函数调用顺序例子
/*当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的
构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。
简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是
要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,
如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。
下面的这个程序说明这个问题*/
//-------------------------------------------------
#include <iostream>
using namespace std;
class Shape
{
public:
void Draw() {cout<<"Base::Draw()"<<endl;}
void Erase() {cout<<"Base::Erase()"<<endl;}
Shape() {Draw();} //基类构造函数,调用上面的Draw函数体
virtual ~Shape() {Erase();}//基类析构函数,调用上面的Erase函数体
};
//-------------------------------------------------
class Polygon:public Shape
{
public:
Polygon() {Draw();}
void Draw() {cout<<"Polygon::Draw()"<<endl;}
void Erase() {cout<<"Polygon Erase()"<<endl;}
~Polygon() {Erase();}
};
//--------------------------------------------------
class Rectangle:public Polygon
{
public:
Rectangle() {Draw();}
void Draw() {cout<<"Rectangle::Draw()"<<endl;}
void Erase() {cout<<"Rectangle Erase()"<<endl;}
~Rectangle() {Erase();}
};
//--------------------------------------------------
class Square:public Rectangle
{
public:
Square() {Draw();}
void Draw() {cout<<"Square::Draw()"<<endl;}
void Erase() {cout<<"Square Erase()"<<endl;}
~Square() {Erase();}
};
//--------------------------------------------------
int main()
{
Polygon c;
Rectangle s;
Square t;
cout<<"------------------------------------------"<<endl;
return 0;
}
//------------------------------------------
运行结果:
Base::Draw()
Polygon::Draw()
Base::dRAW()
Polygon::Draw()
Rectangle::Draw()
Base::dRAW()
Polygon::Draw()
Rectangle::Draw()
Square::Draw()
------------------------------------------
Square Erase()
Rectangle Erase()
Polygon Erase()
Base::Erase()
Rectangle Erase()
Polygon Erase()
Base::Erase()
Polygon Erase()
Base::Erase()
Press any key to continue
C++类的继承中构造函数和析构函数调用顺序例子的更多相关文章
- C++单继承的构造函数和析构函数调用的顺序
1.继承构造函数调用顺序以及销毁的过程 先调用父类的构造函数,在调用子类的构造函数,析构函数调用相反.
- C++中构造函数和析构函数调用的时机
今天看书忽然对这个地方有点模糊,尤其是析构函数在调用默认的析构函数和用户自己覆写的析构函数的时候有点意识模糊呢.写段代码总结下 #include <iostream> using name ...
- 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象
单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...
- javascript 的类式继承(构造函数)
<script type="text/javascript"> //类式继承(构造函数) var father = function(){ this.age = 52; ...
- C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序
C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...
- C++构造函数和析构函数调用虚函数时都不会使用动态联编
先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...
- c++深/浅拷贝 && 构造函数析构函数调用顺序练习题
1.深/浅拷贝 编译器为我们提供的合成拷贝构造函数以及合成的拷贝赋值运算符都是浅拷贝.浅拷贝只是做简单的复制,如果在类的构造函数中new出了内存,浅拷贝只会简单的复制一份指向该内存的指针,而不会再开辟 ...
- C#类继承中构造函数的执行序列
不知道大家在使用继承的过程中有木有遇到过调用构造函数时没有按照我们预期的那样执行呢?一般情况下,出现这样的问题往往是因为类继承结构中的某个基类没有被正确实例化,或者没有正确给基类构造函数提供信息,如果 ...
- 【iOS】Swift类的继承、构造方法、析构器等复习
一.继承与重写, 防止重写 1.1 基类, 不继承任何类. Swift不想OC或者Java中继承自Object类.定义一个类,不继承任何类,该类就是基类. [java] view plaincopy ...
随机推荐
- cmd 开启热点
开启热点,需要先打开Wifi,ssid 为 WiFi 名称,key 为密码 netsh wlan set hostednetwork mode=allow ssid=123 key=12345678 ...
- Linux记录-linux系统常用监控指标
1.Linux运维基础采集项 做运维,不怕出问题,怕的是出了问题,抓不到现场,两眼摸黑.所以,依靠强大的监控系统,收集尽可能多的指标,意义重大.但哪些指标才是有意义的呢,本着从实践中来的思想,各位工程 ...
- WebStorm记录(3)
连通接口 接口 我自己理解前后端传输数据都是通过ajax方式 一般使用get和post两种方式传输数据 GET 接口 接口描述 获取登录验证码图片及密钥 HTTP方法 POST URL /captch ...
- 学习总结:CSS(一)定义方式、选择器、选择器权重
一.CSS的定义方式 1.内部样式:<style></style> 2.行间样式:<div style="width:100px;height:100px;&q ...
- 【坑】zsh和oh-my-zsh卸载后导致无法登陆
apt-get remove zsh 然后断开终端,就再也连不上了,崩溃啊! 以下登陆为www用户登陆 各种找,到这里 https://www.cnblogs.com/EasonJim/p/78630 ...
- Golang入门教程(十一)beego 框架之RESTful Controller 路由
官方文档:https://beego.me/docs/mvc/controller/router.md 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路 ...
- Hibernate的注解和检索
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...
- impala系列:impala特有的操作符
--=======================Impala 特有的操作符--=======================ILIKE 操作符, 忽略大小写的 like 操作符.REGEXP 操作符 ...
- CSS魔法(五)项目实战
三大标签--title.description.keyword 淘宝网 <title>淘宝网 - 淘!我喜欢</title> <meta name="spm ...
- 二十四、Linux 进程与信号---wait 函数
24.1 wait 函数说明 24.1.1 waitpid---等待子进程中断或结束 waitpid(等待子进程中断或结束) 相关函数 wait,fork #include <sys/types ...