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 的类