派生类的构造函数和析构函数和多继承中的二义性与虚函数

析构函数主要作用是对数据成员初始化。

1派生类的构造函数

派生类的构造函数定义的一般形式为:

派生类名::派生类名(基类所需形参,本类成员所需形参):基类1(基类1
参数表),基类2(基类2
参数表),···,基类n(基类n
参数表),对象成员1(对象1
参数表),对象成员2(对象2
参数表),···,对象成员m(对象m
参数表){

//本类基本类型数据成员初始化

}

如果使用基类无参构造函数,派生类构造函数形参表中不包含供给基类构造函数的参数。此时,系统会调用基类的默认构造函数。如果使用对象数据成员的无参构造函数,派生类构造函数形参表中不包含初始化对象数据成员的参数。

2派生类的析构函数

派生类不能继承基类的析构函数,需要自己定义析构函数,以便在派生类对象消亡之前进行必要处理。派生类的析构函数只负责清理它新定义的非对象数据成员,对象数据成员由对象所属类的析构函数负责析构,基类的清理工作由基类的析构函数负责。

4多继承中的二义性与虚函数

4.1多继承的二义性

例,基类base的成员(数据成员和成员函数),要被继承到Fderiver1和Fderiver2,然后又被继承到派生类Sderiver。在派生类Sderiver中,基类base的成员有两份拷贝(在Fderiver1和Fderiver2中)。因此,通过派生类Sderiver的对象访问基类base的公有成员时,编译系统就不知道如何从两份拷贝中进行选取,只好给出“ambiguous”的错误信息,也就出现了二义性。

4.2虚基类

可以解决二义性问题。

将共同基类设置为虚基类的方法是,在定义第一级派生类时用关键字virtual修饰说明继承关系,其语法形式为

Class 派生类名:virtual
继承方式 基类名{

//···

};

对第二级派生类的构造函数要进行一下修改:

构造函数在类外:

派生类名::派生类名(基类所需形参,本类成员所需形参):基类(data):基类1(基类1
参数表),基类2(基类2
参数表),···,基类n(基类n
参数表),对象成员1(对象1
参数表),对象成员2(对象2
参数表),···,对象成员m(对象m
参数表)

构造函数在类内:

派生类名(基类所需形参,本类成员所需形参):基类(data):基类1(基类1
参数表),基类2(基类2
参数表),···,基类n(基类n
参数表),对象成员1(对象1
参数表),对象成员2(对象2
参数表),···,对象成员m(对象m
参数表)

在包含虚基类的继承结构中,系统在建立派生类的对象时,调用构造函数的顺序如下。

①按照虚拟基类被继承的顺序,调用它的构造函数。

②按照非虚拟基类被继承的顺序,调用它的构造函数。

③按照对象数据成员声明的顺序,调用它的构造函数。

④执行派生类自己的构造函数。

时间: 2025-01-04 14:59:44

派生类的构造函数和析构函数和多继承中的二义性与虚函数的相关文章

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

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

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

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

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

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

C++:派生类的构造函数和析构函数的调用顺序

一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: ? 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. ? 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 ? 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 ? 重写派生类的构造函数和析构函数

C++基类和派生类的构造函数和析构函数的调用

C++基类和派生类的构造函数和析构函数的调用 1.调用顺序 当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象.当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数. 所以,构造函数:基类->派生类:析构函数:派生类->基类. 示例: 1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 publi

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] 不是所有的函数都能自动地从基类继承到派生类中的.构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么.所以,在整个层次中的所有的构造函数和析构函数都必须被调用,也就是说,构造函数和析构函数不能被继承. 另外,operator= 也不能被继承,因为它完成类似于构造函数的活动. 2.派生类的构函数被调用时,会先调用基类的其中一个构造函数,因为在派生类的构造函数中用了初始化表的方式调用了基类构造函数,默认不写时是调用了基类中

派生类的构造函数与析构函数的调用顺序

派生类构造函数各部分的执行次序为1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用.2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用3.派生类的构造函数体中的操作 在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数.如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数. //Test1.h #include<iostream> using names

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 }; 以上构造函数的执行过程: