精华内容
下载资源
问答
  • C++派生类构造函数

    2018-06-21 19:44:51
    派生类构造函数执行的一般次序如下: 1、调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 2、对派生类新增的成员对象初始化,调用顺序按照它们在类中声明的顺序。 3、执行派生类的构造函数...

    如果对基类初始化时,需要调用基类的带有形参表的构造函数时,派生类就必须声明构造函数,提供一个将参数传递给基类构造函数的途径,保证在基类进行初始化时能够获得必要的数据。

    派生类构造函数执行的一般次序如下:

    1、调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。
    2、对派生类新增的成员对象初始化,调用顺序按照它们在类中声明的顺序。
    3、执行派生类的构造函数体中的内容。

    实例分析:

    #include <iostream>
    using namespace std;
    class Base1{
        public : Base1(int i){cout<<"构造 Base1 "<<i<<endl; }
    }; 
    class Base2{
        public : Base2(int j){cout<<"构造 Base2 "<<j<<endl;}
    
    }; 
    class Base3{
        public: Base3(){cout<<"构造 Base3 *"<<endl;}
    };
    
    
    class Deriverd: public Base2,public Base1,public Base3{
        public :
            Deriverd(int a,int b,int c,int d):Base1(a),member2(d),member1(c),Base2(b)
            {} 
        private:
            Base1 member1;
            Base2 member2;
            Base3 member3;
    };
    
    int main (){
        Deriverd obj(1,2,3,4);
        return 0;
    }

    该程序执行情况如下 :
    这里写图片描述

    派生类的构造函数定义如下:
    Deriverd(int a,int b,int c,int d):Base1(a),member2(d),member(c),Base2(b) {}
    这里有两个问题需要注意:首先这里并没有列出全部的基类和成员函数,由于Base3只有默认构造函数,不需要给他传递参数,因此,基类Base3以及Base3的成员对象member3就不必列出。其次,基类名和成员对象名的顺序是随意的。
    程序的主函数声明了一个派生类Deriverd的对象obj,生成对象obj时调用了派生类的构造函数。此构造函数的执行情况是先调用基类的构造函数,然后调用内嵌对象的构造函数。基类构造函数按照派生类定义时的顺序,因此应该是Base2,Base1,Base3。而内嵌对象的的构造函数调用顺序是按照成员在类中声明的顺序,应该是Base1,Base2,Base3.
    此时Base1的对象member1传递的参数是c,Base2的对象member2传递的参数是d。

    总结:

    c++中的类是数据和动作的集合,该派生类继承了三个基类,又调用了基类的三个对象,所以该类能够 “执行6个动作” 。派生类的构造函数需要以合适的初值作为参数,其中一些传递给基类的构造函数,用于初始化相应成员,另一些参数要用于对派生类新增的成员对象进行初始化。

    展开全文
  • C++派生类构造函数实战.pdf
  • 定义基类shape,它有默认的构造函数和析构函数; 把点point类声明为shape的派生类,它包含两个数据成员x和y和输出函数display(); 把圆circle定义为点point类的派生类,它在点point的基础上增加一个数据成员radius...

    老师布置的作业要求:

    定义基类shape,它有默认的构造函数和析构函数;

    把点point类声明为shape的派生类,它包含两个数据成员x和y 和输出函数display();

    把圆circle定义为点point类的派生类,它在点point的基础上增加一个数据成员radius;

    并增加输出成员函数 display ()和求面积成员函数area()。

     

    代码如下

    #include<iostream>
    using namespace std;
    #define PI 3.1415926
    class shape
    {
    
    };
    
    class point:public shape
    {
    protected:
        double x;
        double y;
    public:
        point(double xx,double yy)
        {
            x = xx;
            y = yy;
        }
        void Display()
        {
            cout<<"("<<x<<","<<y<<")"<<endl;
        }
    };
    
    class circle:protected point//保护继承point
    {
    private:
        double radius;
    public:
        circle(double xx,double yy,double r):point(x, y)//应该是这样写!注意这里继承的基类里面的参数不要加数据类型,否则会报错
        {
            x = xx;
            y = yy;
            radius = r;
        }
        void Display()
        {
            cout<<"圆心为"<<"("<<x<<","<<y<<"),半径为"<<radius<<endl;
        }
        double area()
        {
            return PI*radius*radius;
        }
    };
    int main()
    {
        point p1(2.3,5.1);
        point p2(1,3);
        p1.Display();
        p2.Display();
    
        circle c1(0,0,1);
        circle c2(1.2,2.3,5);
        c1.Display();
        cout<<c1.area()<<endl;
        c2.Display();
        cout<<c2.area()<<endl;
        return 0;
    }

     

    展开全文
  • 1 派生类构造函数、析构函数描述 作用和形式 派生类可能有多个基类,也可能包括多个对象成员(指本类中的数据成员,此数据成员为某类定义的对象)。在创建派生类对象时,派生类的构造函数除了要负责本类成员的初始化...

    《C++面向对象程序设计》第二版 杜茂康 李昌兵

     

    1 派生类构造函数、析构函数描述

    作用和形式
    派生类可能有多个基类,也可能包括多个对象成员(指本类中的数据成员,此数据成员为某类定义的对象)。 在创建派生类对象时,派生类的构造函数除了要负责本类成员的初始化外,还要调用基类和对象成员的构造函数,并向它们传递参数,以完成基类子对象和对象成员的建立和初始化
    派生类只能采用构造函数初始化列表的方向(顺序)【其实类申明和对象申明先决定构造函数的调用顺序】向基类或对象成员的构造函数传递参数,形式如下:
    派生类构造函数名(参数表):基类构造函数名(参数表),对象成员1(参数列表),...{
    ......
    }
    派生类在构造函数初始化列表(在派生类构造函数中调用基类构造函数和对象成员并传递参数的语句,就是 派生类函数名(参数表):后面的语句列表,把这些语句看成列表)中为基类和对象成员的构造函数初值。当用派生类定义对象时,程序首先调用基类构造函数;接下来构造对象成员(1),最后调用派生类的构造函数。
     

    2 派生类构造函数必需与否

    在基类没有任何构造函数或者基类具有缺省参数的构造函数时,派生类可以不向基类传递参数甚至不需要构造函数(本类没有需要初始化的数据成员),由C++系统隐式生成派生类和基类的构造函数并隐式调用;当基类或对象成员所属类只含有带参数的构造函数时,即使派生类本身没有需要初始化的数据也必须定义构造函数对基类或对象的构造函数传递参数。
     

    3 派生类的构造函数只负责直接基类的初始化

    C++标准有一跳规则:如果派生类的基类同时也是另外一个类的派生类,则每个派生类只负责它的直接基类的构造函数调用。
    举例,有A,B,C三个类,它们都有构造函数这个成员函数。其关系如图1

    图1.类派生类后又派生类
    当由类C定义对象时,构造函数调用的次序为:C的基类B的构造函数被调用;在调用B的构造函数时,由于B又是由类A派生的,所以先调用A的构造函数;然后回溯到A的派生类B,最后回溯到B的派生类C。B和C的构造函数是在回溯中被调用的。
     

    4 构造函数的调用时间和次序

    当派生类具有多个基类和多个成员对象时,它们的构造函数将在创建派生类对象时被调用,调用次序如下:
    基类构造函数-->对象成员构造函数-->派生类构造函数
    • 当有多个基类时,将按照它们继承方式中的声明次序调用。
    • 当有多个对象成员时,将按它们在派生类中的声明次序调用。
    • 当构造函数初始化列表的基类和对象成员的构造函数调用完成之后,才执行派生类构造函数体中的代码。
    • 如果某个对象成员没有在派生类构造函数的初始化列表中,则编译器会自动为其对象构造(对应类为缺省参数即无参数),调用对应构造函数的顺序跟对象被申明的对象相同。

     

    5 构造函数调用次序例子

     
    #include <iostream>
    
    class A {
    	int x;
    public:
    	A (int i=0) {
    		x=i;
    		cout <<"A------"<<x<<end1;
    	}
    };
    
    class B {
    	int y;
    public:
    	B(int i){
    		y = i;
    		cout <<"B----------"<<y<<end1;
    	}
    };
    
    class C : public B {
    public:
    	A a0, a1;
    	C():a1(2),  B(1){
    		cout << "C-----------3"<<end1;
    	}
    };
    
    void main()
    {
    	C c;
    }
    

    在main函数中,当派生类C定义对象c时,将按照B->a0->a1->c的次序调用其内的构造函数。尽管C类的构造函数的参数列表方向为a0(A类缺省参数,编译器按照此顺序自动调用a0对象的构造函数)a1,B1,但是对构造函数的调用次序起决定作用的还是申明次序和类继承关系。所以此程序的执行结果如下:
    B----------1
    A------0 //编译器自动调用a0的构造函数构造对象a0
    A------4
    C-----------3

    这次的笔记将会为理解MFC程序执行流程带去铺垫。
     
     
     
    此次笔记记录完毕。
    展开全文
  • 对于构造函数 : 先执行基类的,再执行对象成员的,最后执行派生类的对于析构函数 : 先执行派生类的,再执行对象成员的,最后执行基类的即 析构顺序与构造顺序相反,示例程序如下: #include #include #include ...

    对于构造函数 :  先执行基类的,再执行对象成员的,最后执行派生类的

    对于析构函数 :  先执行派生类的,再执行对象成员的,最后执行基类的

    即 析构顺序与构造顺序相反,示例程序如下:

     


    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;

    class base
    {
    public :
     base ( )
     {
      cout << " constructing base class " << endl;
     }
     ~base()
     {
      cout << " destructing base class " << endl;
     }
    };

    class base2
    {
     int i;
    public :
     base2 ( int n)
     {
      cout << " constructing base2 class " << endl;
      i = n;
     }
     ~base2()
     {
      cout << " destructing base2 class " << endl;
     }
     void showi()
     {
      cout << i << endl;
     }
    };
    class derived : public base
    {
     int    j;
     base2 obj;
    public :
     derived ( int n) : obj (n)
     {
      cout << " constructing derived class " << endl;
      j = n;
     }
     ~derived( )
     {
      cout << "destructing derived class " << endl;
     }
     void showj()
     {
      cout << j << endl;
     }

    };

    int  main ()
    {
     derived ob(10);
     ob.showj ();
     return EXIT_SUCCESS;
    }

    结果为 :

    constructing base class

    constructing base2 class

    constructing derived  class

    10

    destructing derived class

    destructing base2 class

    destructing base class

    press any key to continue

    展开全文
  •  派生类构造函数名(总参数表):基类构造函数名(参数表) {派生类中新增数据成员初始化语句} 2 有子对象的派生类的构造函数的一般形式为:  派生类构造函数名(总参数表):基类构造函数名(参数表),子...
  • C++继承派生类构造函数的写法

    千次阅读 2019-06-16 22:51:01
    C++有三大思想:抽象与封装、继承与派生、多态性,是c++开发人员面对对象编程必须掌握的知识。 初学者对子类继承中构造函数的写法有时会存在一些问题。即子类继承基类时,子类的...②再执行派生类构造函数本身(...
  • C++派生类构造函数

    千次阅读 2017-08-14 22:00:44
    派生类构造函数 默认情况 基类的构造函数不被继承; 派生类需要定义自己的构造函数C++11规定 可用using语句继承基类构造函数。 但是只能初始化从基类继承的成员。 派生类新增成员可以通过类内初始值进行...
  • 近期在网上搜寻了一下关于C++派生类构造函数的调用问题,大部分博文给出的顺序是: 1、基类构造 2、成员构造 3、派生构造。 这个顺序严格来讲是错误的,对新手极具误导性!  依据侯捷翻译的Stanley B. Lippman...
  • 但由于基类的构造函数和析构函数不能被继承,因此派生类构造函数必须负责调用基类构造函数,并对其所需要的参数进行设置。同样,对派生类对象的清理工作也需要加入新的析构函数。 》派生类的构造函数  派生类...
  • C++派生类构造函数构造函数的执行顺序)

    万次阅读 多人点赞 2018-06-16 16:01:55
    1、单继承时,派生类构造函数总是先调用基类构造函数再执行其他代码 1.1 派生类调用基类的构造函数  类的构造函数不能被继承,构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,...
  • 在进入派生类(derived)的拷贝构造函数之前,就已经调用了基类(based)的构造...即在派生类构造函数内部调用基类构造函数。调试的时候发现无法访问基类的私有成员。 为什么使用初始化列表就可以访问基类的私有成员
  • C++派生类构造函数和析构函数的调用顺序实战.pdf
  • c++派生类继承构造函数方法!!!!!!!!!!!
  • C++派生类构造函数执行次序: 调用基类构造函数,调用顺序为被继承时的顺序(左->右)对派生类的新增成员对象初始化,调用顺序是声明时的顺序。调用顺序都和初始化列表中的顺序无关
  • c++ 派生类构造函数 与 基类构造函数的关系

    千次阅读 多人点赞 2019-05-22 10:35:00
    《面向对象程序设计基础(第二版》李师贤等,第254页:C++语言的基本规则是:创建一个派生类的对象时,如果基类带有构造函数,则先调用基类的构造函数,然后才调用派生类构造函数。 《Thinking in C++》,刘宗田...
  • C++ 派生类构造函数和析构函数

    千次阅读 2016-10-03 11:36:56
    1. 当创建一个派生类对象时,派生类的构造函数必须首先通过调用基类的构造函数来对基类的数据成员进行初始化,然后再执行派生类构造函数的函数体,对派生类新增的数据成员进行初始化。当派生类对象的生存期结束时,...
  • C++派生类Student的构造函数和析构函数.pdf
  • C++程序员的面试中,经常会出现派生类与基类的构造函数、析构函数的执行顺序。其实这是一个很基本的问题,没有什么难度,只需要记住就OK了。   1....派生类构造函数和析构函数的构造原则  1
  • 复制成员和构造函数式 一、派生类构造函数
  • 首先,我们需要了解一下派生类构造函数执行的一般次序。 派生类构造函数执行的一般次序: ①调用基类构造函数,调用顺序按照他们被继承时的声明的顺序(从左往右); ②调用内嵌成员对象的构造函数,...
  • 构造函数的执行顺序,派生类构造函数 and 父类构造函数 and 成员对象构造函数
  • 1.派生类构造函数的调用 (1)一个基类的所有数据成员均被派生类继承。创建一个派生类对象时,系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间。 (2)一个派生类对象在创建时不仅要调用派生类构造...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,242
精华内容 30,096
关键字:

c++派生类构造函数

c++ 订阅