二、有内嵌对象的派生类

  1.一般来说,我们会这样定义构造函数

  student( int i, string nam, int pid, string pnam, int sid) : person( i, nam),parent(pid,pnam){ stuid = sid; }

  person是基类的构造函数,parent是该派生类内嵌的person子对象

 

    2.具体例子

 #include <iostream>
using namespace std;
class A
{
int dataA;
public:
A(int a) :dataA(a) { cout << "调用A的构造函数" << endl; }
};
class B :public A
{
int dataB;
A a1;
public:
B(int, int,int);
};
B::B(int a, int b, int c) :A(a), a1(b){ dataB = c; cout << "调用B的构造函数" << endl; }
void main()
{
cout << "***************************" << endl;
cout << "CRAZY_HENRY的演示:" << endl<< endl;
B b(, , );
}

执行结果:

  进一步,无论参数表中的顺序怎么改变,只要是符合书写规范的,都是可以执行的,而且执行的顺序:(1)基类的构造函数   (2)内嵌基类对象的派生类     (3)派生类新增的数据成员    (4)函数体

  比如,下边这条语句完全打乱了最初的顺序:

B::B(int a, int b, int c) :dataB(c), a1(b),A(a){ cout << "调用B的构造函数" << endl; }

  3.三个类之间的继承和内嵌

  上边分析的是两个类之间的继承和内嵌,其实也是一样的:

 #include <iostream>
using namespace std;
class A
{
int dataA;
public:
A(int a) :dataA(a) { cout << "调用A的构造函数" << endl; }
};
class C
{
int dataC;
public:
C(int c) :dataC(c){ cout << "调用C的构造函数" << endl; }
};
class B :public A
{
int dataB;
C c1;
public:
B(int, int,int);
};
B::B(int a, int b, int c) :dataB(b), c1(c), A(a){ cout << "调用B的构造函数" << endl; } void main()
{
cout << "***************************" << endl;
cout << "CRAZY_HENRY的演示:" << endl<< endl;
B b(, , );
}

  但是,有一点一定要特别注意,在定义B之前,一定要在格式上把C的定义写在B的前边,否则,B的C的内嵌对象是无法识别出来的!

  4.同时内嵌多个对象的时候,也存在显式调用对象的构造函数和隐式调用对象的构造函数的情况,详细分析我在另一篇有关组合类的构造函数里写过博文里写过

【C++学习之路】派生类的构造函数(二)的更多相关文章

  1. 【C++学习之路】派生类的构造函数(三)

    三.多层继承的派生类 1.多层继承的派生类只需在构造函数的初始化列表中写出直接基类的构造函数即可 class student { public: student(int n, string nam) ...

  2. 【C++学习之路】派生类的构造函数(一)

    一.简单派生类的构造函数 1.所谓简单派生类,就是指派生类中不包含基类的内嵌对象的派生类. 2.一般来说,这样的派生类的构造函数的形式是: student( int i, string nam, in ...

  3. C++学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

  4. C++学习17派生类的构造函数

    基类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成.所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都 ...

  5. C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序

    基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...

  6. c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)

    測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace ...

  7. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  8. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  9. C++:派生类的构造函数和析构函数

    4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...

  10. 【C++继承与派生之二】有子对象的派生类的构造函数

    这是我今天看书刚刚看到的,觉着以前对这一块内容了解不多,所以整理一下分享给大家.首先要介绍一下子对象的概念.类的数据成员不仅可以是int.char这样的基本类型,也可以是类对象,如可以包含这样的数据成 ...

随机推荐

  1. 编写C# Windows服务,用于杀死Zsd.exe进程

    最近经常在我的xp系统进程中出现Zsd.exe进程.刚开始他占用内存不是很大.但是过了一段时间就会变成几百M 机器就会变得很卡,网上说Zsd可能是病毒.所以我就想要不写一个Windows服务,让他每隔 ...

  2. codemirror 插件

    做在线词典编辑的时候.里面有些自定义标签.类似html标签一样. 为了让编辑编辑.改成了  <动词></动词> 所以引用了 codemirror插件 此插件绝对牛逼 它主要功能 ...

  3. 简单的猜数字(JAVA版)

    按书上的样例来操作的. 不过,书上提到的BUG,我没有在看下一章时就解决了哈.. 从网上查找的删除数组元素的方法. 其实,将数据结构更改为ARRAYLIST,可能更简单.:) GameHelper.j ...

  4. SCALA中的抽象类代码样例

    package com.hengheng.scala class AbstractClass { } abstract class People { def speak val name : Stri ...

  5. [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记

    1. 二叉搜索树,可以用作字典,或者优先队列. 2. 根节点 root 是树结构里面唯一一个其父节点为空的节点. 3. 二叉树搜索树的属性: 假设 x 是二叉搜索树的一个节点.如果 y 是 x 左子树 ...

  6. 使用 FreeMarker 替换 JSP 的 10 个理由

    你还在使用 Java 服务器页面(俗称JSP)吗?我曾经也是,但是几年前我抛弃了它们,并且再也没有用过JSP了.JSP 是个很好的概念,但是它却剥夺了 web 开发的乐趣. 对我而言,这些都是小事,比 ...

  7. java下载csv文件,中文标题

    @RequestMapping(value = "/export.do") public void exportpushuserByareacode(HttpServletRequ ...

  8. Flashback Version Query、Flashback Transaction Query快速闪回细粒度数据

    Flashback Version Query 闪回版本查询 使用Flashback Version Query  返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本. ...

  9. 装多版本号sqlserver的远程连接问题

    装系统时win7下一直没法装sqlserver2012,后来装了sqlserver2005,前段时间因须要使用sqlserver2012,尝试再装一次,居然装成功了.但是sqlserver2012远程 ...

  10. java实现excel的导入导出(poi详解)[转]

    java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava  经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...