含有虚继承的多继承构造函数执行顺序

 1 #include<iostream>
 2 using namespace std;
 3
 4 class Base1
 5 {
 6 public:
 7     Base1()
 8     {
 9         cout << "class Base1" << endl;
10     }
11 };
12
13 class Base2
14 {
15 public:
16     Base2()
17     {
18         cout << "class Base2" << endl;
19     }
20 };
21
22 class Level1:public Base2,virtual public Base1
23 {
24 public:
25     Level1()
26     {
27         cout << "class Level1" << endl;
28     }
29 };
30
31 class Level2:public Base2,virtual public Base1
32 {
33 public:
34     Level2()
35     {
36         cout << "class Level2" << endl;
37     }
38 };
39
40 class TopLevel:public Level1,virtual public Level2
41 {
42 public:
43     TopLevel()
44     {
45         cout << "class TopLevel" << endl;
46     }
47 };
48
49 int main()
50 {
51     TopLevel obj;
52 }

执行结果 

class Base1class Base2class Level2class Base2class Level1class TopLevel

结论:虚基类的构造函数优先执行
时间: 2024-11-05 12:15:44

含有虚继承的多继承构造函数执行顺序的相关文章

java中成员变量、代码块、构造函数执行顺序

1.java虚拟机运行程序,首先需要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类.初始化子类静态代码块和成员变量 2.load完毕父类与子类后,从main函数入口执行程序,先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时,先初始化非静态成员变量和非静态代码块,接着执行父类构造方法 再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着执行子类构造方法. package it.xiangnan.test; public

实例构造函数与静态构造函数执行顺序

一.结论: 1.实例构造函数与静态构造函数执行顺序 一.初始化顺序(依次是静态变量.静态构造函数.实例变量.实例构造函数) 二.初始化次数(静态的都只会初始化一次) 三.初始化时机(使用类引用任何静态成员之前对或者首次实例化类时会调用静态构造函数,通过静态构造函数初始化类级别的项,即静态字段.非静态的则要在创建对象的时候才初始化): 2.创建子类实例时,其所有构造函数和变量的调用顺序为: 子类静态变量初始化>子类静态构造函数>父类静态变量初始化 > 父类静态构造函数 > 父类实例变

子类继承父类,方法的执行顺序

public class HelloA { static { System.out.println("static A"); } { System.out.println("I'm A class"); } public HelloA() { System.out.println("HelloA"); } } class HelloB extends HelloA { static { System.out.println("stati

C++中多重继承构造函数执行顺序

代码1: 1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 class A{ 7 public: 8 A(){ 9 cout<<"A"<<endl; 10 } 11 }; 12 class B{ 13 public: 14 B(){ 15 cout<<"B"<<endl; 16 } 17 }; 18 cl

java中静态代码块,非静态代码块,构造函数执行顺序

关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 2.随着类的加载而执行,而且只执行一次 先说一下类加载,一个程序要想运行,首先要把代码加载到内存中,然后才能去和CPU交流,这是冯诺依曼计算机规定的.Java也是一样,Java的.class字节码文件要想执行,首先也

Java静态代码块、代码块及构造函数执行顺序

根据以下程序进行分析 定义一个父类 package sas.LearnJava; public class ExcuteOrderTest { { System.out.println("我是在父类开始的普通代码块!"); } public ExcuteOrderTest() { System.out.println("我是父类的无参构造函数!"); } public void showSomething() { System.out.println("我

关于继承中静态代码块,构造代码块,构造函数执行顺序

1 class HelloA { 2 3 public HelloA() { 4 System.out.println("HelloA"); 5 } 6 7 { System.out.println("I'm A class"); } 8 9 static { System.out.println("static A"); } 10 11 } 12 13 public class HelloB extends HelloA { 14 public

虚基类构造函数执行顺序

#include <iostream> using namespace std; class stream { public: stream(){cout<<"stream constructer"<<endl; ~stream(){cout<<"stream destructer"<<endl; }; class iistream : virtual stream { public: iistream()

22.2 继承的 成员变量的执行顺序

/** 继承中成员变量的特点:* 子类只能继承父类的非私有成员* 子父类中成员变量名字是一样的获取的是子类的成员变量*** 就近原则:* 优先级(由近到远)为:局部变量---子类成员变量---父类成员变量**super:子类对象的父类引用.(可以获取父类成员的变量和方法,用法同this)* 调用父类的成员方法和变量*this:当前对象的引用.* 调用子类的成员方法和变量* */ public class 继承成员变量执行优先级 { public static void main(String[]