构造函数中调用虚方法的多态性表现(c++ java比较)


结论

在此先给出结论,如果不想看后面示例代码的跳过即可。

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
/latefirstcmt/16