以下是引用yuccn在2011-3-29 21:52:30的发言:
应该来总结下帖子了
例子的输出为:
Derive - print
Base - print
第一个输出是 pObj->print();因为虚函数的动态绑定,而调用了派生类的接口。
第二个输出,是在析构基类的时候,或许读者会迷惑,为什么析构基类没有调用了动态绑定的接口。这个就涉及到一个c++的很基础的知识了。因为pObj析构的时候,先是派生类的析构,再到基类的析构。再析构基类的时候,派生类已经析构完成了。故在析构基类的时候还想调用动态绑定的接口是不可以了的(因为派生类已经析构了),故调用了基类的接口。
我错了,如果是代码~Derive(){}改成~Derive(){ Base *p=new Derive; p->print();delete p; }结果是: Derive - print应该来总结下帖子了
例子的输出为:
Derive - print
Base - print
第一个输出是 pObj->print();因为虚函数的动态绑定,而调用了派生类的接口。
第二个输出,是在析构基类的时候,或许读者会迷惑,为什么析构基类没有调用了动态绑定的接口。这个就涉及到一个c++的很基础的知识了。因为pObj析构的时候,先是派生类的析构,再到基类的析构。再析构基类的时候,派生类已经析构完成了。故在析构基类的时候还想调用动态绑定的接口是不可以了的(因为派生类已经析构了),故调用了基类的接口。
Derive - print
Base - print
Base - print
如果是静态联编,那么第二行应该是Base-print,但实际上是在运行时确定调用派生类虚函数,其实书上所说的构造函数和析构函数调用虚函数是静态联编,不怎么严谨,我想应该是被逼无奈的动态联编,事实上是在运行是确定的,但没办法,对象初始化时,要先初始化基类成员,只能调用基类的虚函数,而当对象销毁时,要先撤销派生类成员的内存空间,所以等到执行基类析构函数,调用虚函数时,只剩下基类的虚函数。要多实践,学习!