1. 顺序
       当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象。当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。简而言之,就是说,构造函数:基类->派生类。析构函数:派生类->基类。

这个我们完全可以通过一个小程序来说明:

//通过输出就可以看出在创建派生类对象b1时各个函数的调用顺序了
#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"A(Based Class) constructor is called"<<endl;
    }
    ~A()
    {
        cout<<"A(Based Class) destructor is called"<<endl;
    }
};
class B:public A
{
public:
    B()
    {
        cout<<"B(Derived Class) constructor is called"<<endl;
    }
    ~B()
    {
        cout<<"B(Derived Class) destructor is called"<<endl;
    }
};
int main()
{
    B b1;
    return 0;
}

2. 通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式,就是在派生类的构造函数中指定要调用的基类的构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。注:除非基类有默认的构造函数,否则必须采用显式调用方式

下面分别给出一个隐式和显式调用的例子:

#include <iostream>
using namespace std;
class A
{
public:
    A(int x = 0,int y = 0)
    {
        a = x;
        b = y;
    }
private:
    int a;
    int b;
};
//基类A有默认的构造函数,可以隐式调用
class B:public A
{
public:
    B(int z = 0)
    {
        c = z;
    }
private:
    int c;
};
int main()
{
    B b1;
    return 0;
}

#include <iostream>
using namespace std;
class A
{
public:
    A(int x,int y)
    {
        a = x;
        b = y;
    }
private:
    int a;
    int b;
};
//基类A没有默认的构造函数,其现有的构造函数需要传递参数,通过
//派生类构造函数调用A构造函数时必须如下显式调用
class B:public A
{
public:
    B(int x,int y,int z):A(x,y)
    {
        c = z;
    }
private:
    int c;
};
int main()
{
    B b1(1,2,3);
    return 0;
}

原文出处:http://www.cnblogs.com/persistentlyworking/archive/2013/08/26/3282941.html

基类和派生类的构造函数,隐式调用与显式调用相关推荐

  1. Java 构造器之构造器的隐式调用和显式调用

    内容参考<疯狂Java程序员的基本修养>李刚 著 一.结论 当调用某个类的构造器来创建Java对象时,系统总会先调用父类的非静态初始化块进行初始化,这个调用是隐式的.接着会调用父类的一个或 ...

  2. C++中派生类隐式调用与显式调用基类的构造函数

    通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种. 所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造 ...

  3. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  4. 构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...

    虚基类及其派生类构造函数[1] 建立对象时所指定的类称为最远派生类. 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的. 在整个继承结构中,直接或间接继承虚基类的所有派生类,都 ...

  5. 14.11 基类与派生类关系的详细再探讨

    一:派生类对象模型简述 Men mymen:子类(派生类对象),包含多个组成部分(也就是多个子对象); <1>一个是含有派生类自己定义的成员变量,成员函数的子对象: <2>一个 ...

  6. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

  7. C++:基类和派生类

    4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public:void print(){cout<<"name:"<& ...

  8. 基类与派生类之间的转换关系

    一. 派生类到基类的转换: 1.可以使用派生类指针初始化基类指针,同样也可以使用派生类的引用或对象初始化基类的引用,注意这里提到的是对象的指针和引用而不是对象本身: (但是,在使用基类指针(或引用)指 ...

  9. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? 1 #include<iostream> 2 using namespace std; 3 4 class Parent{ 5 publ ...

最新文章

  1. 开发人员MySQL调优-实战篇2-让SQL使用索引详解
  2. 【 Verilog HDL 】赋值冲突问题
  3. Spring Cloud构建微服务架构(五)服务网关
  4. (原创)VS2017 C# 运行 Javasrcipt RSA 加密用户名登录 Java开发的服务器
  5. win10被微软流氓更新后编译基于visual Studio的web项目报[ArgumentOutOfRangeException: 指定的参数已超出有效值的范围...
  6. 带有批注的Spring硒测试
  7. Spring Boot————简介与Spring时代的承接
  8. 找CTO杜仲:技术人别把股权(期权)弄成一张废纸(新书推荐)
  9. 徐汉彬:亿级Web系统搭建—单机到分布式集群
  10. JAVA浮点数浮点数转换成人民币读法
  11. php点广告送积分,PHP猜一猜奇偶商城积分促销模式
  12. git学习(五)分支操作和解决冲突
  13. 区块链 智能合约 虚拟机 EVM 资料总结
  14. 这么多年的土豆都白吃了!土豆还能这么做,太香了
  15. UVa 12307 Smallest Enclosing Rectangle(旋转卡壳+最小覆盖矩形)
  16. deeplink跳转快应用返回出现两次系统添加桌面的弹框
  17. 关于MaxCompute的基本了解
  18. 企业如何建设网站之基础建站教程
  19. Java实现模糊查询
  20. System Design笔记:在线售票系统设计

热门文章

  1. Visual Entity 手册(一)简介
  2. 第01将-Mysql体系结构与存储引擎
  3. 基于SSH框架社区智能化管理系统答辩PPT模板
  4. 合工大计算机学院吴辽源,计算机学院智能计算系统系召开人才培养大讨论专题会议...
  5. 需要知道的面向对象设计的基本原则
  6. java共同方法_java-现有公共方法的NoSuchMethodError
  7. mysql多索引结构_MySQL-索引结构详解
  8. php最难,那个PHP中号称最难的‘递归函数’
  9. comsol分析时总位移代表什么_通过仿真分析球形盖的变形问题
  10. java 通用查询_java 通用查询