background image

    test_func1(&co1);

    test_func1(&co2);

    return 0;

}

 

    在上面的代码里,类 parent1 是一个只具有纯虚函数的接口类,这个类不能被

实例化,它唯一的用途就是抽象一些特定的接口函数,当然,在这里这个接口函

 

数就是纯虚函数 parent1::fun1()。

    而类 child1 和 child2 则是两个从 parent1 继承的类,我们要使用它定义具体的

类实例,所以它实现了由 parent1 继承得来的 fun1 接口,并且各自的实现是不同的

    

 

函数 test_func1 的参数是一个 parent1 类型的指针,它所要完成的功能就是

调用这个 parent1 对象的 fun1()函数。

    让我们编译运行一下上面的代码,可以看到下面的输出

    child1::fun1()

    child2::fun1()

    很显然,在两次调用 test_func1 函数的时候,虽然传入的参数都是一个

parent1 的指针,但是却都分别执行了 child1 和 child2 各自的 fun1 函数!这就是

C++里类的多态。然而,这一切是怎么发生的呢?test_func1 函数怎么会知道应该

调用哪个函数的呢?我不准备像其他人一样画若干图来说明,我准备用具体某个

编译器产生的对象布局以及相应的汇编代码来说明这个过程(这个编译器是

vs2008 里的 vc9)。

    我们先打开一个 VS2008 命令提示窗口,改变目录到上面的代码 Win32Con.cpp

所在目录,输入下面的命令:

    cl  win32con.cpp  /d1reportSingleClassLayoutchild

    上面的命令可以编译 win32con.cpp 源码,同时生成里面类名包含 child 的类