Java/C++;对象创建顺序

Java/C++;对象创建顺序,java,c++,object,Java,C++,Object,请查看以下代码: class Parent { Parent() { printFunction(); } public void printFunction() { System.out.println("Parent Print"); } class ParentInner { ParentInner() { InnerPrint(); } void I

请查看以下代码:

class Parent {
    Parent() {
        printFunction();
    }

    public void printFunction() {
        System.out.println("Parent Print");
    }

    class ParentInner {
       ParentInner() {
          InnerPrint();
       }

       void InnerPrint() {
          System.out.println("Parent Inner print");
       }
    }
}

class Child extends Parent {
    ChildInner ci;
    Child() {
        super();
        ci = new ChildInner();
    }

    @Override
    public void printFunction() {
        System.out.println("Child Print");
    }

    class ChildInner extends ParentInner {
       ChildInner() {
          super();
       }

       @Override
       void InnerPrint() {
          System.out.println("Child Inner print");
       }
    }

    public static void main(String[] args) {
        Child c = new Child();
    }
}
Java编译器(eclipse和linux)的此代码输出为:

<>这在C++(GCC)


你说什么?我认为基类首先被创建,然后子类gcc是逻辑的。Java有什么问题吗?

正如你所怀疑的那样。从
Child
constructor初始值设定项列表调用
Parent
构造函数时,
Child
对象尚未完全创建。因此,在某种程度上,没有<代码>子< /Cord>对象,只是<代码>父< /COD>对象.< /p>什么是C++代码?不看C++代码就不可能说什么。java部分很容易理解:子正在重写所有父方法,所以C++中所有父行为都被删除。为什么顺序不同?那就是我所想的——它在C++中是有意义的。在java中,它打印另一种方式——所有的子打印。@ GrimBee在C++和java中有很多相似之处,它们大多是句法的。C++和java仍然是非常不同的语言,其中的区别是成员函数重写和绑定等。真的,我也推断:)有两种资源来理解这两个对象的创建吗?这看起来令人困惑。我找不到合适的资源来解释上述流程——主要是差异。
Child print
Child Inner print
#include <iostream>
#include <new>
using namespace std;

class Parent {
    public:
    Parent() {
        printFunction();
    }

    virtual void printFunction() {
        cout << "Parent print\n";
    }

    class ParentInner {
       public:
       ParentInner() {
          InnerPrint();
       }

       virtual void InnerPrint() {
          cout << "Parent Inner print\n";
       }
    };
};

class Child : public Parent {
    public:
    Child():Parent() {
        ci = new ChildInner();
    }

    void printFunction() {
        cout << "Child print\n";
    }

    class ChildInner : public ParentInner {
       public:
       ChildInner():ParentInner() {
       }

       void InnerPrint() {
          cout << "Child Inner print\n";
       }
    };

    ChildInner *ci;
};

int main(int argc, char* argv[]) {
   Child *c = new Child();
   return 0;
}
Parent print
Parent Inner print