【发布时间】:2014-03-13 09:51:12
【问题描述】:
请看下面这段代码:
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 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
怎么说?我认为首先创建基类,然后子类 gcc 是合乎逻辑的。 Java 中发生了什么?
【问题讨论】:
-
你的 C++ 代码是什么?
-
不看C++代码什么都说不出来。
-
Java部分很容易理解:Child覆盖了所有Parent方法,所以去掉了所有Parent行为
-
在 C++ 中也是如此。那为什么顺序会不同呢?