1派生类的构造函数

默认情况下:基类的构造函数不被继承,派生类需要定义自己的构造函数。
C++11 规定:可用using语句继承基类构造函数。但是只能初始化从基类继承的成员。这时派生类新增成员可以通过类内初始值进行初始化。

建议:如果派生类有自己新增的成员,且需要通过构造函数初始化,则派生类要自定义构造函数。
若不继承基类的构造函数:
  继承来的成员:自动调用基类构造函数进行初始化
  派生类的构造函数需要给基类的构造函数传递参数。

单继承(派生类只有一个直接基类的情况)时构造函数的定义语法:
  派生类名::派生类名(基类所需的形参,本类成员所需的形参):
  基类名(参数表), 本类成员初始化列表
  {
  //其他初始化;
  };

//单继承时的构造函数举例
#include<iostream>
using namespace std;
class B{
public:B();B(int i);~B();void print() const;
private:int b;
};
B::B(){b = 0;cout << "B's default constructor called." << endl;
}
B::B(int i){b = i;cout << "B's constructor called." << endl;
}
B::~B(){cout << "B's destructor called." << endl;
}
void B::print() const{cout << b << endl;
}
class C: public B{
public:C();C(int i, int j);~C();void print() const;
private:int c;
};
C::C(){c = 0;cout << "C's default contructor called." << endl;
}
C::C(int i, int j):B(i),c(j){cout << "C's constructor called." << endl;
}
C::~C(){cout << "C's destructor called." << endl;
}
void C::print() const{B::print();cout << c << endl;
}
int main(){C obj(5,6);obj.print();return 0;
}

构造函数的执行顺序:
  1 调用基类构造函数。
    顺序按照它们被继承时声明的顺序(从左向右)。
  2 对初始化列表中的成员进行初始化。
    顺序按照它们在类中定义的顺序。
    对象成员初始化时自动调用其所属类的构造函数。由初始化列表提供参数。
  3 执行派生类的构造函数体中的内容。


2派生类构造函数举例

//7-4派生类构造函数举例
#include<iostream>
using namespace std;
class Base1{//基类1,构造函数有参数
public:Base1(int i){cout << "Constructing Base1 " << i << endl;}
};
class Base2{//基类2,构造函数有参数
public:Base2(int j){cout << "Constructing Base2 " << j << endl;}
};
class Base3{//基类3,构造函数无参数
public:Base3(){cout << "Constructing Base3 *" << endl; }
};
class Derived: public Base2, public Base1, public Base3{
public:Derived(int a, int b, int c, int d):Base1(a), member2(d), member1(c), Base2(b){}//此处的次序与构造函数的执行次序无关
private://派生类的私有对象成员
    Base1 member1;Base2 member2;Base3 member3;
};
int main(){Derived obj(1,2,3,4);return 0;
}


3派生类复制构造函数
派生类未定义复制构造函数的情况:
  编译器会在需要时生成一个隐含的复制构造函数;
  这个隐含复制构造函数,先调用基类的复制构造函数;
  再为派生类新增的成员执行复制。

派生类定义了复制构造函数的情况:
  一般都要为基类的复制构造函数传递参数。
  复制构造函数只能接受一个参数,既用来初始化派生类定义的成员,也将被传递给基类的复制构造函数。
  基类的复制构造函数形参类型是基类对象的引用,实参可以是派生类对象的引用
  如: C::C(const C &c1): B(c1) {…}


4派生类的析构函数
析构函数不被继承,派生类如果需要,要自行声明析构函数。
声明方法与无继承关系时类的析构函数相同。
不需要显式地调用基类的析构函数,系统会自动隐式调用。
先执行派生类析构函数的函数体,再调用基类的析构函数。

//7-5派生类对象析构举例
#include<iostream>
using namespace std;
class Base1{
public:Base1(int i){cout << "Constructing Base1 " << i << endl;}~Base1(){cout << "Destructing Base1" << endl;}
};
class Base2{
public:Base2(int j){cout << "Constructing Base2 " << j << endl;}~Base2(){cout << "Destructing Base2" << endl;}
};
class Base3{
public:Base3(){cout << "Constructing Base3 *" << endl;}~Base3(){cout << "Destructing Base3" << endl;}
};
class Derived: public Base2, public Base1, public Base3{
public:Derived(int a, int b, int c, int d):Base1(a), member2(d), member1(c), Base2(b){}
private:Base1 member1;Base2 member2;Base3 member3;
};
int main(){Derived obj(1,2,3,4);return 0;
}

转载于:https://www.cnblogs.com/leosirius/p/8065282.html

Part7 继承与派生 7.4派生类的构造和析构相关推荐

  1. c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)

    目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员处理 ...

  2. String类的构造与析构相关处理

    String类原型: 1 Class String 2 { 3 Public: 4 String(const char *str); 5 String(const String &other) ...

  3. 【汇编 C++】类的构造与析构

    目录 前言 一.类的构造函数 什么是构造函数? 构造函数的特点 构造函数的作用 二.类的析构函数 什么是析构函数? 析构函数的特点 小结 析构函数的作用 总结 结语 封面 前言 本文章将会可能会涉及到 ...

  4. c++基础知识点(6)类的继承,构造,析构顺序,虚继承等

    学习继承之前,我们先回顾下protected(保护)成员 protected 成员的特点与作用: -对建立其所在类对象的模块来说,它与private成员的性质相同 -对于其派生类来说,它与public ...

  5. 转:Delphi2010新发现-类的构造和析构函数功能

    Delphi2010发布了. 虽然凭着对Delphi的热爱第一时间就安装了,但是现在可能是年纪大了,对新事物缺乏兴趣了.一直都没有仔细研究. 今天有点时间试了一下新功能. 本来C#和Delphi.NE ...

  6. 5、继承与派生4-派生类的构造和析构函数

    派生类的构造函数只负责对派生类新增的成员进行初始化,对所有从基类继承下来成员,其初始化工作还是由基类的构造函数完成.同样,对派生类对象的扫尾.清理工作也需要加入新的析构函数. 1.构造函数 构造派生类 ...

  7. 不同派生方式下基类成员在派生类中的可访问范围属性

    不同派生方式下基类成员在派生类中的可访问范围属性 派生方式 派生方式 派生方式 基类成员 公有派生 私有派生 保护派生 私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护 公有成员 公 ...

  8. 4.定义并实现一个Person类,包含姓名(name)与编号(code)等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(showInfo)。从Person类派生出一个Student类,拥有数

    package monster.zf.Test; /*** 4.* 定义并实现一个Person类,包含姓名(name)与编号(code)* 等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(s ...

  9. 7.20在学生类student和教师类teacher 基础上再派生出一个助教类

    /*在学生类student和教师类teacher基础上 再派生出一个助教类TeachAssistant,一个助教既具有教师的特征, 又具有学生的特征,还有自己的新特征:工资(wage). 要求将助教类 ...

最新文章

  1. 不断的困惑:为什么我仍然使用JavaScript函数语句
  2. 减少模型方差的方法借鉴
  3. A Full Hardware Guide to Deep Learning
  4. IBASE and ES change pointer
  5. AttributeError: type object ‘Image‘ has no attribute ‘open‘
  6. 安卓开发——基于ViewPager的图片轮播
  7. webpack打包VUE项目读取外部配置文件,灵活配置域名
  8. Debian安装软件商店-Debian的GUI软件管理
  9. Python实现Pearson相关系数计算及公式化简过程
  10. 一次由于SQL Server BUG引起的数据库AlwaysOn主从切换故障分析处理
  11. MyBatis:万能Map和模糊查询(狂神)
  12. Python生成器与迭代器
  13. 浅谈char类型范围
  14. Hive 高级篇(调优)
  15. Idea创建SpringBoot搭建SSM框架项目,支持JSP页面
  16. “透视HTTP协议”之破冰篇个人总结
  17. c++使用ODBC读取EXCEL表格
  18. CSLA公链为NFT带来更多可能—csla超级公链到底是干啥的
  19. cnn识别不定长英文验证码
  20. Bundle Adjustment (BA) in vSLAM or SFM

热门文章

  1. 1.5编程基础之循环控制 23 药房管理
  2. mysql 4.0手工注入_手工注入——MySQL手工注入实战和分析
  3. Jenkins Gitee 实现持续集成CI/CD工具【免费、推荐】
  4. 不允许指针指向不完整的类类型_8.7 C语言动态内存分配与指向它的指针变量
  5. PHP笔记-所有错误统一输出404页面(详细错误日志输出,提高安全性)
  6. Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)
  7. linux cpu load 详解,理解linux cpu load - 什么时候应该担心了
  8. docker php nginx,docker 构建nginx + php
  9. java ee jstl_Java EE之JSTL(下)
  10. linux将所有文件生成lst_10行Python代码自动清理电脑内重复文件,解放双手!