C++继承後的建构函式与解构函式

  若您继承了某个类别之后,当您在生成衍生类别的物件时若不指定参数,无参数的预设建构子会被执行,而基础类别的无参数预设建构子也会被执行,所以基于这种特性,通常预设建构子中会撰写一些通用的成员状态初始,例如设定一些预设值。

  如果继承之后,您要使用衍生类别生成物件,在生成物件时指定参数,并同时执行基底类别中的某个参数建构子,您可以使用 : 运算子

  例如:

  // Point2D类别

  class Point2D {

  public:

  Point2D() {

  _x = 0;

  _y = 0;

  }

  Point2D(int x, int y) : _x(x), _y(y) {

  }

  private:

  int _x;

  int _y;

  };

  // Point3D类别

  class Point3D : public Point2D { // 继承Point2D类别

  public:

  Point3D() {

  _z = 0;

  }

  // 建构函式,同时指定呼叫父类别建构函式

  Point3D(int x, int y, int z) : Point2D(x, y), _z(z) {

  }

  private:

  int _z; // 新增私用资料

  };

  如果您使用衍生类别生成物件,则建构函式的执行顺序会从基底类别的建构函式开始执行起,这是可以理解的,因为基底类别是衍生类别的基础,一些基础的参数或初始状态必须先完成,再来再完成衍生类别中的建构函式。

  而在物件被消灭时,解构函式的执行顺序则正好相反,是从衍生类别的解构函式开始执行,再来才是基础类别的建构函式,因为若基底类别的解构函式如果先执行,则衍生类别相依于基底类别的一些状态也会被解构(例如指标),则此时再行衍生类别的解构函式,将存在着相依问题而造成错误。

  下面这个简单的程式可以告诉您建构函式与解构函式,在继承之后的执行顺序:

  #include using namespace std; class Foo1 { public:

  Foo1() {

  cout << "Foo1建构函式" << endl;

  }

  ~Foo1()

  {

  cout << "Foo1解构函式" << endl;

  }

  };

  class Foo2 : public Foo1 { public:

  Foo2() {

  cout << "Foo2建构函式" << endl;

  }

  ~Foo2() {

  cout << "Foo2解构函式" << endl;

  }

  };

  int main()

  {

  Foo2 f;

  cout << endl;

  return 0;

  }

  执行结果:

  Foo1建构函式

  Foo2建构函式

  Foo2解构函式

  Foo1解构函式

时间: 2016-10-17

C++继承後的建构函式与解构函式的相关文章

学习响应式设计:如何实现响应式Web设计

文章描述:淘宝响应式WebUI设计实践. 感谢贷岩的邀请,我在本期奶茶会上做了"响应式设计实践"的分享,是接着上一次的话题进一步讨论"如何实现".响应式Web设计(Responsive Web design)是当下比较流行的话题,什么是响应式设计?简单讲,页面的设计与开发应当根据用户行为以及设备环境(系统平台.屏幕尺寸.屏幕定向等)进行相应的响应和调整.具体的实践方式由多方面组成,包括弹性网格和布局.图片.CSS media query的使用等. 响应式设计听起来非

android--显式跳转和隐式跳转的区别用法

#创建第二个activity* 新创建的activity,必须在清单文件中做配置,否则系统找不到,在显示时会直接报错 <activity android:name="com.itheima.createactivity.SecondActivity"></activity>* 只要有以下代码,那么就是入口activity,就会生成快捷图标 <intent-filter>                <action android:name=&

响应式Web设计:通过响应式的设计开发方式

文章描述:案例学习 响应式网站的产品需求和设计流程详解. 今次的译文中,我们继续响应式Web设计方面的话题.前面的几篇相关文章以概念诠释.方法说明为主,本篇则围绕一个实际网站案例展开,从需求.流程.步骤细节等方面描述了响应式设计在项目中的实践方式. 本篇的部分内容要点会与之前几篇产生交集:我们会在这些地方提供相应文章的入口,便于深入参考阅读.接下来进入正文. 根据DailyTech的统计,到2015年,移动互联网的用户数量将会超过桌面用户.除了智能手机之外,使用平板电脑甚至是电视机进行上网的用户

继承ViewGroup重写onMeasure方法的详解

我们继承重写ViewGroup的目的是要做自定义控件,所以我们有必要先看一下安卓View的绘制过程: 首先当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree,绘画通过遍历整个树来完成,不可见的区域的View被放弃. 每一个ViewGroup 负责要求它的每一个孩子被绘制,每一个View负责绘制自己. 因为整个树是按顺序遍

C++:通过私有(private)继承复用类实现工厂函数详解

通过接口类(interface class), 实现工厂函数, 可以复用(reuse)已有类, 重写实现接口. 如: 接口类: IPerson; 复用类: PersonInfo; 实现类: CPerson; 工厂函数: DatabaseID askUserForDatabaseID(); std::shared_ptr<IPerson> makePerson(DatabaseID personIndetifier); 可以通过私有继承复用类PersonInfo,公有继承接口类IPerson,

android--显式跳转和隐式跳转

区别如下: 显式启动Activity指的是在Intent内部直接声明要启动的activity所对应的class. 隐式启动Activity的intent到底发给哪个activity,需要进行三个匹配,一个是action, 一个是category,一个是data,可以是全部或部分匹配,同样适用于Service和BroadcastReceiver. A:显式启动 下面用代码来解释什么是显式启动. [java] view plain copy    print? Intent intent=new I

html css 响应式-一个关于前端响应式的问题

问题描述 一个关于前端响应式的问题 我在网上弄了一份html css的代码,里面有一个菜单的响应式,当屏幕缩小,菜单会隐藏并出现按钮.我在硬盘上操作能出来效果.但是放到jsp中就没这个效果了,其它响应效果却正常. 求帮帮忙看看.代码代码

三星Note4如何使用弹出式窗口?N9108V弹出式窗口使用教程

1.长按[返回]键,打开多窗口.    2.点击要开启的应用程序,这里以[S日历]为例.     3.就会以弹出式窗口打开S日历.    4.您也可以通过最近应用程序打开弹出式窗口,点击[最近应用程序]键.    5.长按某一应用程序即可打开弹出式窗口,这里以[S日历]为例.    6.S日历以弹窗形式出现在屏幕上.    

Java实现单例模式之饿汉式、懒汉式、枚举式_java

单例模式的实现(5种) 常用: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高,可以延时加载) 其他: 双重检测锁式(由于jvm底层内部模型原因,偶尔会出问题,不建立使用) 静态内部类式(线程安全,调用效率高,但是可以延时加载) 枚举单例(线程安全,调用效率高,不能延时加载) 饿汉式单例具体代码如下: package com.lcx.mode; /** * * 饿汉式单例,不管以后用不用这个对象,我们一开始就创建这个对象的实例, * 需要的时候就返回已创建好的实