虚函数有关面试题
class A{ public: A(){p();} virtual void p(){print("A")} virtual ~A(){p();} }; class B:public A{ public: B(){p();} void p(){print("B")} ~B(){p();} }; int main(int, char**){ A* a=new B(); delete a; }
这段程序的输出:ABBA
题目想构造一个B类的对象,B继承自A,所示首先构造A,A中构造函数调用P,虽然P是虚函数,按理来说应该动态绑定,但是此时B并没有被构造,所以只能调用自己的P函数(输出A),接下来构造B,调用B的P函数(输出B),接着析构从派生类到基类,首先析构B,调用B的P函数(输出B),接着调用A的析构函数,按理来说应该动态绑定,但是此时B已经被析构,所以只能调用自己的P函数(输出A)。
解释就是上面的,但是C++不推荐在构造/析构函数中调用虚函数进行动态绑定,详情请看Effective C++。