派生类构造函数
- 格式:doc
- 大小:23.00 KB
- 文档页数:2
前面我们说基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。
构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。
在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。
这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。
下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:1.#include<iostream>ing namespace std;3.4.//基类People5.class People{6.protected:7.char*m_name;8.int m_age;9.public:10.People(char*,int);11.};12.People::People(char*name,int age):m_name(name),m_age(age){}13.14.//派生类Student15.class Student:public People{16.private:17.float m_score;18.public:19.Student(char*name,int age,float score);20.void display();21.};22.//People(name, age)就是调用基类的构造函数23.Student::Student(char*name,int age,float score):People(name, age),m_score(score){}24.void Student::display(){25.cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<"。
1.什么是类的继承与派生?继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。
继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。
它使得某类对象可以继承另外一类对象的特征和能力。
继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。
通过继承方式定义的子类也称为派生类。
2.类的三种继承方式之间的区别是什么?类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。
对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。
表5.1列出了不同继承方式下基类成员访问属性的变化情况。
表5.1 不同继承方式下基类成员的访问属性说明:该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。
其余单元格内容为基类成员在派生类中的访问属性。
从表中可以看出:(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。
(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。
(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。
(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。
需要注意的是:保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。
在同一类中私有成员和保护成员的用法完全一样。
3.派生类能否直接访问基类的私有成员?若否,应如何实现?派生类不能直接访问基类的私有成员。
具体实现方式:(1) 在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。
保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。
这样,既方便了派生类的访问,又禁止外界对它的派生类访问。
C++程序设计模拟试卷(一)一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1. 编写C++程序一般需经过的几个步骤依次是()A. 编辑、调试、编译、连接B。
编辑、编译、连接、运行C. 编译、调试、编辑、连接D. 编译、编辑、连接、运行答案:B解析:经过编辑、编译、连接和运行四个步骤。
编辑是将C++源程序输入计算机的过程,保存文件名为cpp。
编译是使用系统提供的编译器将源程序cpp生成机器语言的过程,目标文件为obj,由于没有得到系统分配的绝对地址,还不能直接运行。
连接是将目标文件obj转换为可执行程序的过程,结果为exe。
运行是执行exe,在屏幕上显示结果的过程.1.基类的构造函数。
2.子对象的构造函数。
3.成员初始化表中的其他项.4.派生类构造函数的函数体。
2。
决定C++语言中函数的返回值类型的是()A。
return语句中的表达式类型B。
调用该函数时系统随机产生的类型C。
调用该函数时的主调用函数类型D. 在定义该函数时所指定的数据类型答案:D解析:函数的返回值类型由定义函数时的指定的数据类型决定的.A项的表达式的值要转换成函数的定义时的返回类型.3。
下面叙述不正确的是()A。
派生类一般都用公有派生B。
对基类成员的访问必须是无二义性的C. 赋值兼容规则也适用于多重继承的组合D. 基类的公有成员在派生类中仍然是公有的答案:D解析:继承方式有三种:公有、私有和保护.多继承中,多个基类具有同名成员,在它们的子类中访问这些成员,就产生了二义性,但进行访问时,不能存在二义性。
赋值兼容规则是指派生类对象可以当作基类对象使用,只要存在继承关系,所以单继承或多继承都适用。
基类中的公有成员采用私有继承时,在派生类中变成了私有成员,所以D项错误.4。
所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是()A。
构造函数的执⾏顺序⼀、C#中构造函数有⼏种。
1.静态构造函数2.默认构造函数3.带参数的构造函数⼆、顺序如何执⾏呢?先看代码:class MyClass{static MyClass(){Console.WriteLine("静态构造函数被调⽤。
");}private static Component staticField = new Component("静态字段被实例化。
");private Component instanceField = new Component("实例成员字段被实例化。
");public MyClass(){Console.WriteLine("对象构造函数被调⽤。
");}}//此类型⽤于作MyClass类的成员//此类型在实例化的时候可以再控制台输出⾃定义信息,以给出相关提⽰class Component{public Component(String info){Console.WriteLine(info);}}class Program{static void Main(string[] args){MyClass instance = new MyClass();Console.Read();}} 运⾏结果:1.静态字段被实例化2.静态构造函数被调⽤3.实例成员字段被实例化4.对象构造函数被调⽤再来看看带基类的构造函数是如何运⾏class Base{static Base(){Console.WriteLine("基类静态构造函数被调⽤。
");}private static Component baseStaticField = new Component("基类静态字段被实例化。
");private Component baseInstanceField = new Component("基类实例成员字段被实例化。
c++派生类的构造函数C++是一门面向对象的编程语言,它允许程序员使用类和对象来封装数据和行为。
在C++中,派生类是基于已存在的类(称为基类)创建的一种新类。
派生类从基类继承了数据和方法,并且还可以添加新的属性和方法。
在C++中,派生类的构造函数是指创建派生类对象时所调用的函数。
派生类的构造函数负责初始化派生类对象中从基类继承的成员和派生类自己添加的成员。
本文将详细介绍C++派生类的构造函数。
在C++中,派生类的构造函数必须调用基类的构造函数,以初始化从基类继承的成员变量。
在创建派生类对象时,首先创建基类对象,然后再对派生类对象进行初始化。
1. 构造函数必须有与类名相同的名称。
2. 构造函数可以有参数,也可以没有参数。
3. 派生类必须调用基类的构造函数,以初始化从基类继承的成员变量。
下面是一个基类Person和一个派生类Student的定义:```cppclass Person{protected:string name;int age;public:Person(){}void setName(string n){name = n;}void setAge(int a){age = a;}};在定义派生类Student的时候,通过public继承了基类Person。
此时,派生类的构造函数必须调用基类的构造函数,以初始化从基类继承的成员变量name和age。
派生类新增加了一个成员变量grade,需要在自己的构造函数中进行初始化。
派生类构造函数可以有多种调用方式,具体如下:1. 用基类构造函数初始化列表初始化派生类对象初始化列表是C++语言提供的一种简洁的初始化成员变量的语法。
它使用冒号(:)后接一个以逗号分隔的初始化列表,在其中对派生类和基类成员变量进行初始化。
下面是Student类中使用初始化列表对基类成员变量进行初始化的方法:在上面的代码中,派生类Student的构造函数使用冒号后接一个初始化列表来初始化基类成员变量name和age。
派生类的构造函数及其对象的初始化由于构造函数不能被继承,因此,派生类的构造函数中除了对派生类中数据成员进行初始化外,还必须通过调用直接基类的构造函数来对基类中数据成员初始化,一般地将,对派生类中数据成员初始化放在该派生类构造函数的函数体内,而调用基类构造函数的基类中数据成员初始化放在该构造函数的成员初始化表中。
派生类构造函数的格式如下表示:<派生类构造函数名>(<参数表>) : <成员初始化表>{<派生类构造函数的函数体>}其中,<派生类构造函数名>同该派生类的类名。
<成员初始化表>中包含如下的初始化项:①基类的构造函数,用来给基类中数据成员初始化;②子对象的类的构造函数,用来给派生类中子对象的数据成员初始化;③派生类中常成员的初始化。
<派生类构造函数的函数体>用来给派生类中的数据成员初始化。
派生类构造函数的调用顺序如下:①基类构造函数;②子对象的构造函数;③成员初始化表中其他初始化项;④派生类构造函数的函数体。
在基类中有默认构造函数时,派生类的构造函数中可隐含调用基类中的默认构造函数。
派生类中析构函数由于析构函数也不能继承,因此派生类的析构函数中将调用直接基类的析构函数。
执行派生类析构函数的顺序正好与指向派生类的构造函数的顺序相反。
先调用派生类的析构函数,再调用子对象类的析构函数,最后调用直接基类的析构函数。
例如:分析下列程序的输出结果,掌握派生类构造函数的定义格式和执行顺序,以及派生类析构函数的调用方法。
#include<iostream>using namespace std;class A{int x;protected: int y;public: int z;A(int a,int b,int c){x=a;y=b;z=c;}//定义构造函数基类初始化int Getx(){return x;} //定义成员函数返回xint Gety(){return y;} //返回yvoid ShowA(){cout<< "x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n';}};class B:public A{int m,n;public: B(int a,int b,int c,int d,int e):A(a,b,c){m=d;n=e;} //派生类的构造函数void Show(){cout<<"m="<<m<<'\t'<<"n="<<n<<'\n';cout<<"x="<<Getx()<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; }int Sum(){return ( Getx()+y+z+m+n);}};int main(void){B b1(1,2,3,4,5);b1.ShowA(); b1.Show();cout<< "Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t';cout << "y=" <<b1.Gety()<<'\t'; cout << "z="<<b1.z<<'\n';return 0;}。
派生类的构造函数派生类是指从基类继承而来的子类,它们在继承基类的同时,可以增加自己的成员变量和成员函数。
在C++中,派生类的构造函数是一种特殊的函数,用于初始化派生类的对象。
本文将介绍派生类的构造函数的基本概念、特点和使用方法。
一、派生类的构造函数的基本概念派生类的构造函数是一种特殊的函数,它用于初始化派生类的对象。
它可以调用基类的构造函数来初始化基类的成员变量,也可以初始化派生类自己的成员变量。
派生类的构造函数必须在定义派生类时进行声明和定义。
在定义派生类的构造函数时,需要指定它所继承的基类的构造函数的调用方式。
如果不指定,编译器会默认调用基类的默认构造函数。
如果基类没有默认构造函数,那么编译器会报错。
派生类的构造函数和基类的构造函数一样,可以有多个,但是它们之间必须有不同的参数列表。
如果没有定义派生类的构造函数,那么编译器会自动生成一个默认的构造函数。
二、派生类的构造函数的特点1. 派生类的构造函数必须先调用基类的构造函数,再初始化自己的成员变量。
2. 如果派生类的构造函数没有显式地调用基类的构造函数,编译器会默认调用基类的默认构造函数。
3. 如果基类没有默认构造函数,那么派生类的构造函数必须显式地调用基类的构造函数,并且在参数列表中传递必要的参数值。
4. 派生类的构造函数可以调用基类的构造函数的任何一个版本,包括默认构造函数、拷贝构造函数和移动构造函数。
5. 派生类的构造函数可以覆盖基类的构造函数,但是必须保证派生类的构造函数与基类的构造函数的参数列表不同。
6. 派生类的构造函数可以调用自己的其他构造函数,但是必须保证调用顺序正确,不会出现死循环。
三、派生类的构造函数的使用方法1. 显式地调用基类的构造函数派生类的构造函数可以显式地调用基类的构造函数,以初始化基类的成员变量。
调用基类的构造函数的方法有两种:一种是在派生类的构造函数的初始化列表中调用,另一种是在派生类的构造函数的函数体中调用。
c++ 派生类构造函数C++是一种面向对象的编程语言,提供了派生类(子类)的概念,允许我们在已有类的基础上进行扩展并添加新的行为和属性。
派生类的构造函数是创建和初始化派生类对象时调用的函数。
本文将介绍C++中派生类构造函数的概念、使用方法和注意事项。
在C++中,每个类都有一个构造函数,用于创建和初始化该对象。
派生类继承了基类的成员变量和成员函数,但是派生类需要自己的构造函数来初始化它自己的成员变量。
派生类构造函数既可以调用基类构造函数来初始化基类成员变量,也可以初始化自己的成员变量。
派生类构造函数有以下特点:1.派生类构造函数的函数名必须与类名相同。
2.派生类构造函数必须在其成员初始化列表中调用基类构造函数。
3.派生类构造函数只能直接或间接调用基类构造函数,不能调用基类的析构函数。
二、派生类构造函数使用方法1.调用基类构造函数派生类默认情况下会继承基类的构造函数,因此,派生类的构造函数需要在函数体前调用基类的构造函数,以初始化基类成员变量。
调用基类构造函数的写法为构造函数名::构造函数名(参数列表) : 基类构造函数名(参数列表)。
例如下面的代码:```class Base {public:Base(int n) {this->n = n;}protected:int n;};在上面的代码中,Derived继承了Base的属性和方法,但Base的构造函数需要通过Derived的构造函数进行调用。
在Derived构造函数的函数体中,我们可以定义自己的成员变量,并为它们赋初值。
2.初始化自己的成员变量除了要调用基类的构造函数外,派生类的构造函数还要初始化自己的成员变量。
派生类构造函数的成员初始化列表用于初始化自身的成员变量。
例如:在上面的代码中,Derived类有一个名为m的私有成员变量,会在Derived的构造函数中被初始化。
1.在执行派生类构造函数时,如果基类和派生类都有默认构造函数,则默认情况下会先调用基类的默认构造函数,再调用派生类的默认构造函数。
实验四继承㈠——派生类定义及访问权限一、实验目的1.理解继承的概念、特性及在C++语言中的实现方法;2.掌握C++语言派生类的定义,熟悉不同的继承方式(派生方式);3.掌握派生类构造函数的定义及在定义、释放派生类对象时构造函数、析构函数的执行顺序;4.掌握不同继承方式下,基类的成员在派生类中的访问特性;5.初步熟悉派生类的应用。
二、实验学时课内实验:2课时课外练习:2课时三本实验涉及的新知识㈠继承的有关概念1.继承是面向对象程序设计思想最重要的概念之一,其主要作用是提高软件的可重用性和可维护性。
在C++中,实现继承的机制是通过派生得到的,原类(被继承的类)称为基类,在基类的基础上创建的新类称为派生类。
2.继承具有层次结构,越在上面的类越具有普通性和共性,而下层类比上层类更具体,越在下层的类越细化、专门化;同时,继承具有传递性,即派生类能自动继承上层基类的全部数据结构及操作方法(数据成员及成员函数)。
3.在C++中,继承分为单继承与多继承。
只有一个基类的继承称为单继承;有二个或以上基类的继承称为多继承。
㈡派生类的定义1.定义格式class 派生类名:继承方式基类名{ 派生类新定义的成员};2.说明⑴在定义派生类时用“:”将派生类与基类分开,构成类的层次结构;⑵派生类与普通类的定义一样,仍然包括数据成员与成员函数。
㈢派生类的构造函数与析构函数1.派生类的构造函数⑴定义格式派生类名(参数表): 基类名(参数名1,参数名2,…){ 构造函数函数体}⑵说明①如果基类中显式定义了构造函数为基类数据成员赋初值,在派生类中也应显式定义构造函数,除为新增数据成员进行初始化外,同时也为基类的数据成员提供初始化的参数表。
②派生类的构造函数也可以重载。
③可以定义派生类的无参构造函数,有参构造函数及带缺省参数的构造函数。
2.构造函数与析构函数的执行顺序⑴定义派生类对象时,先执行基类的构造函数,再执行派生类的构造函数。
⑵释放派生类对象时,先调用派生类的析构函数,再调用基类的析构函数。
C++各种构造函数的写法原⽂转载于:构造函数,是⼀种特殊的⽅法。
主要⽤来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符⼀起使⽤在创建对象的语句中。
特别的⼀个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。
(摘⾃百度百科)。
⼀、最基本的构造函数1class Base2 {3public:4 Base(int var) : m_Var(var)5 {6 }7private:8int m_Var;9 };以上构造函数的执⾏过程:1)传参 2)给类数据成员开辟空间 3)执⾏冒号语法给数据成员初始化 4)执⾏构造函数括号⾥⾯的内容这⾥需要说明的是:冒号语法后⾯的内容相当于int a = 10;(初始化),⽽构造函数括号⾥⾯则是相当于是int a; a = 10;(赋初值)⼆、拷贝构造函数1class Base2 {3public:4 Base(int var) : m_Var(var)5 {6 }7//拷贝构造函数8 Base(Base &ref) : m_Var(ref.m_Var)9 {10 }11private:12int m_Var;13 };为什么拷贝构造函数的参数只能⽤引⽤呢?这就要从拷贝构造函数式数码时候触发开始说起了,以下⼏种情况都会⾃动调⽤拷贝构造函数:1)⽤⼀个已有的对象初始化⼀个新对象的时候2)将⼀个对象以值传递的⽅式传给形参的时候3)函数返回⼀个对象的时候所以当⼀个对象以传递值的⽅式传⼀个函数的时候,拷贝构造函数⾃动的被调⽤来⽣成函数中的对象。
如果⼀个对象是被传⼊⾃⼰的拷贝构造函数,它的拷贝构造函数将会被调⽤来拷贝这个对象这样复制才可以传⼊它⾃⼰的拷贝构造函数,这会导致⽆限循环直⾄栈溢出除了当对象传⼊函数的时候被隐式调⽤以外,拷贝构造函数在对象被函数返回的时候也同样的被调⽤。
(摘⾃百度百科)。
拷贝构造函数,⼀般不需要⾃⼰编写,系统默认的拷贝构造函数就能抗住了,但是有些情况需要在构造的时候开辟空间,这时候就需要拷贝构造函数了,如下代码是摘⾃林锐博⼠的⾼质量C++编程指南⼀⽂。
派生类的构造函数赋值和析构函数执行顺序基类的构造函数和析构函数是不能被继承的1、如果基类没有定义构造函数,派生类也可以不定义构造函数,使用默认的构造函数,其新增成员的初始化可以用其他公有函数来实现.2.如果基类中定义了缺省构造函数或根本没有定义任何一个构造函数(此时,由编译器自动生成缺省构造函数)时,在派生类构造函数的定义中可以省略对基类构造函数的调用,即省略<基类名>(<参数表>)。
3、如果基类定义了带有形参表的构造函数派生类就必须加入新的构造函数,提供一个将参数传递给基类构造函数的途径,保证在基类进行初始化时能够获得必要的数据因此,如果基类的构造函数定义了一个或多个参数时,派生类必须定义构造函数。
4.对派生类对象的清理工作也需要加入新的析构函数。
5. 子对象的情况与基类相同。
派生类的数据成员由所有基类的数据成员与派生类新增的数据成员共同组成,如果派生类新增成员中包括其他类的对象(子对象),派生类的数据成员中实际上还间接包括了这些对象的数据成员。
因此,构造派生类的对象时,必须对基类数据成员、新增数据成员和成员对象的数据成员进行初始化。
派生类的构造函数必须要以合适的初值作为参数,隐含调用基类和新增对象成员的构造函数,来初始化它们各自的数据成员,然后再加入新的语句对新增普通数据成员进行初始化。
派生类构造函数的一般格式如下:<派生类名>::<派生类名>(<参数表>) : <基类名1>(<参数表1>),……,<基类名n>(<参数表n>),<子对象名1>(<参数表n+1>),……,<子对象名m>(<参数表n+m>){派生类新增成员的初始化函数语句;}说明:(1) 对基类成员和子对象成员的初始化必须在成员初始化列表中进行,新增成员的初始化既可以在成员初始化列表中进行,也可以在构造函数体中进行。
1.概念填空题1。
1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。
1。
2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。
当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员.1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体.1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。
在派生类中采用虚基类或作用域分辨符来消除该问题.2.简答题2.1 派生类如何实现对基类私有成员的访问?2。
2什么是类型兼容规则?2.3派生类的构造函数是怎样的执行顺序,析构函数的执行顺序是如何实现的?2.4继承与组合之间的区别与联系是什么?2.5什么是虚基类?它有什么作用?含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚基类的初始化?3.选择题3.1下面对派生类的描述中,错误的是(D ).A.一个派生类可以作为另外一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类中保持不变3.2下列对友元关系叙述正确的是(A)。
A.不能继承B.是类与类的关系C.是一个类的成员函数与另一个类的关系D.提高程序的运行效率3。
3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。
A.任何成员B.公有成员和保护成员C.公有成员和私有成员D.私有成员3.4设置虚基类的目的是(B).A.简化程序B.消除二义性C.提高运行效率D.减少目标代码3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( C )。
派生类构造函数
派生类的数据成员由所有基类的数据成员与派生类新增的数据成员共同组成,如果派生类新增成员中包括其他类的对象(子对象),派生类的数据成员中实际上还间接包括了这些对象的数据成员。
因此,构造派生类的对象时,必须对基类数据成员、新增数据成员和成员对象的数据成员进行初始化。
派生类的构造函数必须要以合适的初值作为参数,隐含调用基类和新增对象成员的构造函数,来初始化它们各自的数据成员,然后再加入新的语句对新增普通数据成员进行初始化。
派生类构造函数的一般格式如下:
<派生类名>::<派生类名>(<参数表>) : <基类名1>(<参数表1>),
……,
<基类名n>(<参数表n>),
<子对象名1>(<参数表n+1>),
……,
<子对象名m>(<参数表n+m>)
{
<派生类构造函数体> //派生类新增成员的初始化
}
说明:
(1) 对基类成员和子对象成员的初始化必须在成员初始化列表中进行,新增成员的初始化既可以在成员初始化列表中进行,也可以在构造函数体中进行。
(2) 派生类构造函数必须对这三类成员进行初始化,其执行顺序如下所述。
. 调用基类构造函数;
. 调用子对象的构造函数;
. 派生类的构造函数体;
(3) 当派生类有多个基类时,处于同一层次的各个基类的构造函数的调用顺序取决于定义派生类时声明的顺序(自左向右),而与在派生类构造函数的成员初始化列表中给出的顺序无关。
(4) 如果派生类的基类也是一个派生类,则每个派生类只需负责其直接基类的构造,依次上溯。
(5) 当派生类中有多个子对象时,各个子对象构造函数的调用顺序也取决于在派生类中定义的顺序(自前至后),而与在派生类构造函数的成员初始化列表中给出的顺序无关。
(6) 派生类构造函数提供了将参数传递给基类构造函数的途径,以保证在基类进行初始化时能够获得必要的数据。
因此,如果基类的构造函数定义了一个或多个参数时,派生类必须定义构造函数。
(7) 如果基类中定义了缺省构造函数或根本没有定义任何一个构造函数(此时,由编译器自动生成缺省构造函数)时,在派生类构造函数的定义中可以省略对基类构造函数的调用,即省略"<基类名>(<参数表>)"。
(8) 子对象的情况与基类相同。
(9) 当所有的基类和子对象的构造函数都可以省略时,可以省略派生类构造函数的成员初始化列表。
(10) 如果所有的基类和子对象构造函数都不需要参数,派生类也不需要参数时,派生类构造函数可以不定义。
(11) 派生类不能继承基类的构造函数和析构函数。