结论
在此先给出结论,如果不想看后面示例代码的跳过即可。
java程序在构造函数中调用类中虚方法A时,A的表现具有多态性,即跟平常Override特性一样;
c++程序在构造函数中调用类中虚方法时,不具多态性,virtual失效;
测试代码
以下c++和java代码所做的功能是一模一样的,旨在测试构造中调用虚方法
func1()
看其输出; 如果是执行到子类的func1
,则说明起了运行时多态的效果,反之则失效。
c++ code
// filename: PolyTest.cpp
#include <cstdio>
class Base {
public:
Base() {
func1();
}
virtual void func1() {
printf("Base.func1 run\n");
}
};
class Child: public Base {
public:
Child() {
func1();
}
virtual void func1() {
printf("Child.func1 run\n");
}
};
int main(int argc, char* args[]) {
Base* obj = new Child();
printf("test end\n");
return 0;
}
编译,运行结果:
[user@localhost test]$ g++ PolyTest.cpp
[user@localhost test]$ ./a.out
Base.func1 run
Child.func1 run
test end
java code
// filename: PolyTest.java
class Base {
public Base() {
func1();
}
public void func1() {
System.out.println("Base.func1 run");
}
}
class Child extends Base {
public Child() {
func1();
}
@Override
public void func1() {
System.out.println("Child.func1 run");
}
}
public class PolyTest {
public static void main(String[] args) {
Base obj = new Child();
System.out.println("test end");
}
}
eclipse编译,运行结果:
Child.func1 run
Child.func1 run
test end