精华内容
下载资源
问答
  • 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个动作” 。派生类的构造函数需要以合适的初值作为参数,其中一些传递给基类的构造函数,用于初始化相应成员,另一些参数要用于对派生类新增的成员对象进行初始化。

    展开全文
  • 派生类构造函数

    2017-03-30 18:35:22
    1、 构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。像任何类一样,如果类不定义自己的默认构造函数和复制控制成员,就将使用合成版本。 2、 派生类的合成默认...相反派生类构造函数

    1、  构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员。像任何类一样,如果类不定义自己的默认构造函数和复制控制成员,就将使用合成版本。

    2、  派生类的合成默认构造函数除了初始化派生类的数据成员之外,它还初始化派生类对象的基类部分。基类部分由基类的默认构造函数初始化。

    3、  派生类构造函数的初始化列表只能初始化派生类的成员,不能直接初始化继承成员。相反派生类构造函数通过将基类包含在构造函数初始化列表中来间接初始化继承成员。

    4、  构造函数初始化列表为类的基类和成员提供初始值,它并不指定初始化的执行次序。首先初始化基类,然后根据声明次序初始化派生类的成员。  

    5、  一个类只能初始化自己的直接基类。直接就是在派生列表中指定的类。如果类 C 从类 B 派生,类 B 从类 A 派生,则 B 是 C 的直接基类。虽然每个 C 类对象包含一个 A 类部分,但 C 的构造函数不能直接初始化 A 部分。相反,需要类 C 初始化类 B,而类 B 的构造函数再初始化类 A。这一限制的原因是,类 B 的作者已经指定了怎样构造和初始化 B 类型的对象。像类 B 的任何用户一样,类 C 的作者无权改变这个规约。

    6、  构造函数只能初始化其直接基类的原因是每个类都定义了自己的接口。一旦类定义了自己的接口,与该类对象的所有交互都应该通过该接口,即使对象是派生类对象的一部分也不例外。

    展开全文
  • 构造函数的执行顺序,派生类构造函数 and 父类构造函数 and 成员对象构造函数

    对于派生类的构造函数,定义对象时构造函数的执行顺序为 2->1->3

    1、成员对象构造函数

    2、基类构造函数

    3、派生类本身构造函数

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
    	A()
    	{
    		cout<<"The constructor of A"<<endl;
    	}
    };
    class C
    {
    public:
    	C()
    	{
    		cout<<"The constructor of C"<<endl;
    	}
    };
    class B:public A
    {
    	C member_c;
    public:
    	B()
    	{
    		cout<<"The constructor of B"<<endl;
    	}
    };
    
    int main(void)
    {
    	B member_b;
    
    	system("pause");
    	return 0;
    }

    展开全文
  • 派生类构造函数规则

    千次阅读 2015-01-19 16:21:12
    派生类构造函数规则 如果基类拥有构造函数但是没有默认构造函数,那么派生类的构造函数必须显示的调用基类的某个构造函数。   以B类从A类派生为例,我们总结如下: 1、若B有构造函数而A没有,当创建B类的对象时,B...

                                   派生类构造函数规则

    如果基类拥有构造函数但是没有默认构造函数,那么派生类的构造函数必须显示的调用基类的某个构造函数。

     

    B类从A类派生为例,我们总结如下:

    1、若B有构造函数而A没有,当创建B类的对象时,B的相应构造函数被自动调用。

    2、若B没有构造函数而A有,则A必须拥有默认构造函数,只有这样,当创建B类的对象时,才能自动执行A的默认构造函数。

    3、若B有构造函数,且A有默认构造函数,则创建B类的对象时,A的默认构造函数会自动执行,除非当前被调用的派生类构造函数在其初始化段中显示的调用了A的非默认构造函数。

    4、若BA都有构造函数,但A没有默认构造函数,则B的每个构造函数必须在其初始化段中显示地调用A的某个构造函数。只有这样,当创建B的对象时,A的构造函数才能获得执行机会。

    再次强调,在创建派生类对象时,必须显示地或隐式地执行其基类的某个构造函数,这一点非常重要,有时候,派生类的构造函数可能会依赖基类的构造函数来完成一些必要的操作,例如,依赖基类的构造函数来完成部分数据成员的初始化。而且,一般可以认为派生类对象是对基类对象的特化,这进一步说明了为什么基类的构造函数(如果该类有构造函数)必须在派生类对象创建时首先执行,在此之后,派生类的构造函数再负责处理派生类中的特化信息(派生类中的新增数据成员)。

    代码实例:(1

    <span style="font-size:14px;">#include <iostream> 
    using namespace std;  
    class A  
    {  
    public:
    private:  
        int x;  
    }; 
    class B:public A  
    {  
    public:  
        B(int c)  
        {  
            y=c;  
            cout<<"Bb"<<endl;  
        }  
        void fun()  
        {  
            cout<<"in B fun"<<endl;  
        }  
    private:  
        int y;  
    };  
    int main(void)  
    {  
        
        A *b=new B(2); 
        system("pause");  
        return 0;  
    }</span>


    执行结果为Bb

     

    代码实例(2

    #include <iostream>  
    using namespace std;  
    class A  
    {  
    public:  
        A() {cout<<"Aa"<<endl; }     
    private:  
        int x;  
    };  
    class B:public A  
    {  
    public:  
       
    private:  
        int y;  
    };  
    int main(void)  
    {  
        
        A*b=new B;
        system("pause");  
        return 0;  
    } 


    执行结果为Aa

     

    代码实例(3):

    <span style="font-size:14px;">#include <iostream>  
    using namespace std;  
    class A  
    {  
    public:  
        A() {cout<<"Aa"<<endl; }    
        A(int c)  
        {  
            x=c;  
            cout<<"A"<<endl;  
        }  
        void fun()  
        {  
            cout<<"in A fun"<<endl;  
        }  
    private:  
        int x;  
    };    
    class B:public A  
    {  
    public:  
        /*
    B(int c,int b) :A(c) 
        {  
            y=b;  
            cout<<"B"<<endl;  
        }  
    */
    B(int c)  
        {  
            y=c;  
            cout<<"Bb"<<endl;  
        }  
        void fun()  
        {  
            cout<<"in B fun"<<endl;  
        }  
    private:  
        int y;  
    };  
    int main(void)  
    {  
        //A *a=new B(2,3); 
        A *b=new B(2); 
        // A*b=new B;
        system("pause");  
        return 0;  
    }</span>


    执行结果是Aa Bb

     

    代码实例(4

    <span style="font-size:14px;">#include <iostream> 
    using namespace std;  
    class A  
    {  
    public:  
        //A() {cout<<"Aa"<<endl; }    
        A(int c)  
        {  
            x=c;  
            cout<<"A"<<endl;  
        }  
    private:  
        int x;  
    };  
    class B:public A  
    {  
    public:  
        
    B(int c,int b) :A(c) 
        {  
            y=b;  
            cout<<"B"<<endl;  
        }  
    /*
    B(int c)  
        {  
            y=c;  
            cout<<"Bb"<<endl;  
        }  */
    private:  
        int y;  
    };  
    int main(void)  
    {  
        A *a=new B(2,3); 
        //A *b=new B(2); 
        // A*b=new B;
        system("pause");  
        return 0;  
    }</span>


    执行结果A B

     

    代码实例(5

    <span style="font-size:14px;">#include <iostream>  
    using namespace std;  
    class A  
    {  
    public:  
        A() {cout<<"Aa"<<endl; }   
        A(int c)  
        {  
            x=c;  
            cout<<"A"<<endl;  
        }  
    private:  
        int x;  
    };  
    class B:public A  
    {  
    public:  
    B(int c,int b) :A(c) 
        {  
            y=b;  
            cout<<"B"<<endl;  
        }  
    B(int c)  
        {  
            y=c;  
            cout<<"Bb"<<endl;  
        }  
    private:  
        int y;  
    };  
    int main(void)  
    {  
        A *a=new B(2,3); 
        A *b=new B(2); 
        system("pause");  
        return 0;  
    } </span>


    执行结果A B Aa Bb

    展开全文
  • 派生类构造函数 构造派生类对象流程:基类构造函数->派生类构造函数 析构派生类对象流程:派生类析构函数->基类析构函数 派生类实际上是使用基类的构造函数来初始化其基类部分。 传递参数给基类构造函数...
  • C++派生类构造函数执行次序: 调用基类构造函数,调用顺序为被继承时的顺序(左->右)对派生类的新增成员对象初始化,调用顺序是声明时的顺序。调用顺序都和初始化列表中的顺序无关
  • 首先说明:由于构造函数不能被继承...一般地将,对派生类中数据成员初始化放在该派生类构造函数的函数体内,而调用基类构造函数的基类中数据成员初始化放在该构造函数的成员初始化表中。派生类构造函数的格式如下表示:
  • 派生类构造函数的定义和使用举例

    万次阅读 2016-05-29 13:43:07
    1.派生类构造函数的一般形式为:派生类构造函数名(总参数表):基类构造函数名(参数表){ 派生类中新增加数据成员初始化语句}2.在建立一个对象时,执行构造函数的顺序是:a.派生类构造函数先调用基类构造函数;b....
  • 派生类构造函数 派生类的构造函数受继承关系的影响,每个派生类构造函数除了初始化自己的数据成员之外,还要初始化基类。 一,合成的派生类默认构造函数 派生类的合成默认构造函数:除了初始化派生类的数据成员...
  • 怎样才能同时存在派生类构造函数和基类构造函数 ``` public class constructor : baseclass { int varliable = new int();//相当于初始化为0 //此构造函数将调用 BaseClass.BaseClass() public constructor...
  • C++继承派生类构造函数的写法

    千次阅读 2019-06-16 22:51:01
    C++有三大思想:抽象与封装、继承与派生、多态性,是c++开发人员面对对象编程必须掌握的知识。 初学者对子类继承中构造函数的写法有时会存在一些问题。即子类继承基类时,子类的...②再执行派生类构造函数本身(...
  • 1.派生类的构造函数  当基类的构造函数没有参数,或没有显示定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数. ...在C++中派生类构造函数的一般形式为: 派生类名(参数总表):基类名(参数表)
  • 派生类构造函数的调用顺序如下: 基类的构造函数; 子对象类的构造函数; 派生类的构造函数. 实例:
  • 一、派生类构造函数的写法(1)冒号前面是派生类构造函数的头部,这和我们以前介绍的构造函数的形式一样,但它的形参列表包括了初始化基类和派生类的成员变量所需的数据;冒号后面是对基类构造函数的调用,这和普通...
  • 派生类 构造函数

    2009-11-02 18:41:00
    派生类Student的构造函数可以通过base关键字来调用基类Person的构造函数,并通过基类的构造函数对继承的字段进行初始化,而派生类构造函数只负责对自己扩展的字段进行初始化。 using System;public class Person{...
  • 4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构 造函数;当撤销派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。...
  • 派生类构造函数的任务应该包括3个部分: 对基类数据成员初始化; 对子对象数据成员初始化; 对派生类数据成员初始化。 程序中派生类构造函数首部如下:  Student1(int n, string nam,int n1, string nam1,int a,...
  • 1.派生类构造函数的调用 (1)一个基类的所有数据成员均被派生类继承。创建一个派生类对象时,系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间。 (2)一个派生类对象在创建时不仅要调用派生类构造...
  • 对于派生类构造函数,在定义对象时构造函数的执行顺序为? 1:成员对象的构造函数 2:基类的构造函数 3:派生类本身的构造函数 顺序为213; 当派生类中不含对象成员时 · 在创建派生类对象时,构造函数的执行...
  • 派生类构造函数的成员初始化列表 A. 基类的构造函数 B. 派生类对象的初始化 D.派生类中一般数据成员的初始化 不行 C. 基类子对象的初始化 #include<iostream> using namespace std; class X { private: int...
  • 关于派生类构造函数与基类构造函数的调用顺序问题,我们先看一下书上的说法:  《面向对象程序设计基础(第二版》李师贤等,第254页:C++语言的基本规则是:创建一个派生类的对象时,如果基类带有构造函数,则先...
  • 派生类构造函数和析构函数的执行顺序 链接: link. #include <iostream> using namespace std; class Contained1 { public: Contained1() { cout << "Contained1 ctor\n"; }//构造constructor ~...
  • (1)基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增成员进行初始化,就必须加入派生类构造函数 (2)从基类继承的成员仍有基类的构造函数完成 (3)但需要在派生类构造函数中对基类的构造...
  • 派生类构造函数的执行顺序       下面给出一个例子   代码: 1 #include 2 3 using namespace std; 4 5 6 //打印函数名辅助宏 7 #define PRINT_FUNC_NAME()\ 8 cout endl; 9 10...
  • 定义基类shape,它有默认的构造函数和析构函数; 把点point类声明为shape的派生类,它包含两个数据成员x和y和输出函数display(); 把圆circle定义为点point类的派生类,它在点point的基础上增加一个数据成员radius...
  • C ++ 派生类构造函数执行的次序

    千次阅读 2017-01-06 12:40:03
    C ++派生类构造函数执行的次序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 146,706
精华内容 58,682
关键字:

对于派生类的构造函数