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

二、有内嵌对象的派生类

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

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

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

 

    2.具体例子

 1 #include <iostream>
 2 using namespace std;
 3 class A
 4 {
 5     int dataA;
 6 public:
 7     A(int a) :dataA(a) { cout << "调用A的构造函数" << endl; }
 8 };
 9 class B :public A
10 {
11     int dataB;
12     A a1;
13 public:
14     B(int, int,int);
15 };
16 B::B(int a, int b, int c) :A(a), a1(b){ dataB = c; cout << "调用B的构造函数" << endl; }
17 void main()
18 {
19     cout << "***************************" << endl;
20     cout << "CRAZY_HENRY的演示:" << endl<< endl;
21     B b(1, 2, 3);
22 }

执行结果:

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

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

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

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

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

 1 #include <iostream>
 2 using namespace std;
 3 class A
 4 {
 5     int dataA;
 6 public:
 7     A(int a) :dataA(a) { cout << "调用A的构造函数" << endl; }
 8 };
 9 class C
10 {
11     int dataC;
12 public:
13     C(int c) :dataC(c){ cout << "调用C的构造函数" << endl; }
14 };
15 class B :public A
16 {
17     int dataB;
18     C c1;
19 public:
20     B(int, int,int);
21 };
22 B::B(int a, int b, int c) :dataB(b), c1(c), A(a){ cout << "调用B的构造函数" << endl; }
23
24 void main()
25 {
26     cout << "***************************" << endl;
27     cout << "CRAZY_HENRY的演示:" << endl<< endl;
28     B b(1, 2, 3);
29 }

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

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

时间: 2024-10-25 14:16:38

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

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

一.简单派生类的构造函数: 1.所谓简单派生类,就是指派生类中不包含基类的内嵌对象的派生类. 2.一般来说,这样的派生类的构造函数的形式是: student( int i, string nam, int sid) : person( i, nam) { stuid = sid; } person(是基类的初始化列表) 3.构造函数的初始化列表的使用 3.1所有的构造函数都可以拿参数的初始化表来构造完全属于自己的数据成员,比如: 1 #include <iostream> 2 using na

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

三.多层继承的派生类 1.多层继承的派生类只需在构造函数的初始化列表中写出直接基类的构造函数即可 1 class student 2 { 3 public: 4 student(int n, string nam) 5 { 6 num = n; name = nam; 7 } 8 }; 9 class student1 : public student 10 { 11 public: 12 student1(int n, string nam, int a) :student(n, nam) {

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

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

測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base() { cout<<"base destroyed!"<<endl; } };

对C++中派生类的构造函数和析构函数的认识

一:构造函数 形式:派生类名::派生类名:基类名1(参数1),基类名2(参数2),--基类名n(参数n),数据成员1(参数1),数据成员2(参数2),--数据成员n(参数n){ 各种操作的说明 } 执行过程:先执行基类的构造函数,再进行数据成员的赋值,最后执行函数体. 其中基类名和数据成员的顺序是由在派生类的定义中声明的顺序决定执行的顺序的,因此它们的顺序是任意的,但为了可读性,还是最好按顺序写. 如果基类只有默认构造函数,则基类名和参数表可以不用写出来. 二:复制构造函数 派生类的构造函数的形

C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程:

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

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

sdut 5-2 派生类的构造函数

5-2 派生类的构造函数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 通过本题目的练习可以掌握派生类构造函数的定义和使用方法. 要求定义一个基类Person,它有3个protected的数据成员:姓名name(char *类型).性别 sex(char类型).年龄age(int类型):一个构造函数用于对数据成员初始化:有一个成员函数show()用于输出数据成员的信息. 创建Person类的公有派生类Employee,增加两

派生类的构造函数

派生类对象包含基类对象 执行派生类构造函数之前,先执行基类的构造函数 派生类交代基类初始化,具体形式: 构造函数名(形参表):基类名(基类构造函数实参表) { } 析构函数先调用派生类的构造函数,再调用基类的析构函数. 创建派生类的对象时,执行派生类的构造函数之前: 调用基类的构造函数------初始化派生类对象中从基类继承的成员 调用成员对象类的构造函数------初始化派生类对象中的成员对象 执行完派生类的析构函数后: 调用成员对象类的析构函数 调用基类的析构函数 析构函数的调用顺序和构造函

5-3 多级派生类的构造函数

5-3  多级派生类的构造函数 Time Limit: 1000MS    Memory limit: 65536K 题目描述 要求定义一个基类protected的数据成员:姓名sex(char类型):一个构造函数用于对数据成员初始化. Employee,增加两个数据成员 基本工资 leaveDays(Employee类的公有派生类):为它定义初始化成员信息的构造函数,和显示数据成员信息的成员函数共如示例数据所示,共<font face='\"Times' new=""