基类构造函数的调用顺序,有虚基类时 多继承构造函数调用顺序

1 , 有虚基类时 多继承构造函数调用顺序虚基如果构造中包括多个虚基类 , 它们的调用顺序以声明顺序为准 。如果虚类是由非虚类派生而来,那非虚类的构造函数要先被调用 。下面是一个例子:class X : public Y, virtual public Z X one;调用顺序如下:Z(); // 虚基类初始化Y(); // 非虚基类X(); // 继承类
2,多重继承里面的构造函数执行顺序还有虚基类的 知识总是弄不明白构造函数执行顺序是:虚基类->基类->内嵌对象->派生类. 如果一个类有多个直接基类,而这些直接基类又有共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多份同名成员.在访问这些同名的成员时,必须在派生类对象名后增加直接基类名,使其惟一地标识一个成员,以免产生二义性.虚基类就可以避免这样的二义性的产生.
3,调用构造方法的顺序首先编译程序会自动寻找main方法(这就是为什么一个JAVA文件只有一个MAIN方法的原因) , 它发现main方法在class Sandwich中,那它就会进入class Sandwich中 , 在进入之前,//他会调用class Sandwich的构造函数,//在它调用class Sandwich的构造函数之前 , 它发现class Sandwich是继承自class PortableLunch,那它就会进入class PortableLunch中,在进入之前 , //那它会先调用class PortableLunch的构造函数,//在它调用class PortableLunch的构造函数之前 , 它又发现class PortableLunch是继承自class Lunch,那它就会进入class Lunch中,在进入之前,//那它会先调用class Lunch的构造函数 , //在它调用class Lunch的构造函数之前 , 它再次发现class Lunch是继承自class Meal,那它就会进入class Meal中,调用class Meal的构造函数,这时会输出 :Meal() 往下依次进入class Lunch中调用class Lunch的构造函数,输出:Lunch()进入class PortableLunch中调用class PortableLunch的构造函数 , PortableLunch() 这时该进入class Sandwich中了,class Sandwich中的第一条语句是:private Bread b= new Bread();他就会调用相应的方法 , 之后也是一样所以最后调用class Sandwich的构造函数,才会输出:Sandwich() 总结:初始化的顺序为:==============================================================================================================================先初始化父类的静态代码--->初始化子类的静态代码-->====(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码---> ====初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数==============================================================================================================================简单一点说 。基类也叫父类 。派生类 也叫子类 。没有老子哪来的儿子????这个应该是java问题把 。。c++我没学过不知道就按java里说了实际上是因为要创建子类的同时必须先创建父类class aa()system out println("a");}}class b extends ab()system out println(b);}public static void main(string args[])b b1=new a();}编译这个程序的话会输出ab你会发现a的构造方法被调用了 但是你并没有 new a();来创造一个a类的对象 实际上编译器会自动创意一个 a类的对象然后以这个对象为基础创建b的对象}顺序:1、初始化时,先初始化父类 。2、类初始化时,先初始化成员变量 。所以new Sandwich()时,先是初始父类: Meal -> Lunch->PortableLunch,接着初始化本身的成员变量: b, c, i,最后是本身的构造函数 。首先编译程序会自动寻找main方法(这就是为什么一个JAVA文件只有一个MAIN方法的原因),它发现main方法在class Sandwich中,那它就会进入class Sandwich中,在进入之前,//他会调用class Sandwich的构造函数,//在它调用class Sandwich的构造函数之前,它发现class Sandwich是继承自class PortableLunch,那它就会进入class PortableLunch中,在进入之前,//那它会先调用class PortableLunch的构造函数,//在它调用class PortableLunch的构造函数之前 , 它又发现class PortableLunch是继承自class Lunch,那它就会进入class Lunch中 , 在进入之前,//那它会先调用class Lunch的构造函数 , //在它调用class Lunch的构造函数之前,它再次发现class Lunch是继承自class Meal , 那它就会进入class Meal中,调用class Meal的构造函数,这时会输出 :Meal() 往下依次进入class Lunch中调用class Lunch的构造函数,输出:Lunch()进入class PortableLunch中调用class PortableLunch的构造函数 , PortableLunch() 这时该进入class Sandwich中了,class Sandwich中的第一条语句是:private Bread b= new Bread();他就会调用相应的方法,之后也是一样所以最后调用class Sandwich的构造函数 , 才会输出:Sandwich() 总结:初始化的顺序为:==============================================================================================================================先初始化父类的静态代码--->初始化子类的静态代码-->====(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码---> ====初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数==============================================================================================================================写这么多,先执行父类的构造 , 实例话成员变量,在调用构造里的内容,教你个简单方法,你在eclipse里面设置断点,然后debug下一直按跟入……看看数据走向,顺序:1、初始化时,先初始化父类 。2、类初始化时,先初始化成员变量 。所以new Sandwich()时,先是初始父类: Meal -> Lunch->PortableLunch,接着初始化本身的成员变量: b, c, i , 最后是本身的构造函数 。【基类构造函数的调用顺序,有虚基类时 多继承构造函数调用顺序】

    推荐阅读