Java/ c++对象创建顺序
Java/C++ Object creation order
请看下面这段代码:
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)的输出是:
Child print
Child Inner print
这个,在c++ (gcc)
#include <iostream>
#include <new>
using namespace std;
class Parent {
public:
Parent() {
printFunction();
}
virtual void printFunction() {
cout << "Parent printn";
}
class ParentInner {
public:
ParentInner() {
InnerPrint();
}
virtual void InnerPrint() {
cout << "Parent Inner printn";
}
};
};
class Child : public Parent {
public:
Child():Parent() {
ci = new ChildInner();
}
void printFunction() {
cout << "Child printn";
}
class ChildInner : public ParentInner {
public:
ChildInner():ParentInner() {
}
void InnerPrint() {
cout << "Child Inner printn";
}
};
ChildInner *ci;
};
int main(int argc, char* argv[]) {
Child *c = new Child();
return 0;
}
打印:
Parent print
Parent Inner print
说什么?我认为基类首先被创建,然后子- gcc是合乎逻辑的。Java发生了什么?
正如你所料。当你从Child
构造函数初始化列表中调用Parent
构造函数时,Child
对象还没有完全创建。所以在某种程度上,还没有Child
对象,只有Parent
对象。
相关文章:
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 具有包含其他对象的类的对象创建顺序
- 如何创建线程序列以按照启动顺序执行任务?
- 如何创建跟踪以显示存在递归的调用顺序
- 我不知道如何创建一个以数字/字母顺序打印出我的整数或字符串的程序
- 创建按顺序索引的有序映射
- 虚拟基类的创建顺序
- 替换decorator模式以强制执行创建顺序
- 按执行顺序创建Pthread
- 创建顺序类对象
- 在同一优先级队列中创建递增和递减顺序选项
- C++和QML的对象顺序创建QT
- 对象创建和销毁顺序(按C++排列)
- 使用一个数组以相反的顺序创建另一个数组
- 原始数据包创建导致 IP 字段顺序不正确
- 为具有默认值的非顺序参数函数创建启动器
- 静态/全局对象的创建顺序
- 对象创建顺序,cpp
- 如何在c/c++中创建顺序的伪随机数
- Java/ c++对象创建顺序