C++之构造函数、析构函数、虚函数、多态、动态绑定
1、构造函数和析构函数
结果是只调用了父类A的析构函数,而没有调用B类的,是因为没有实现动态绑定,在C++中只有虚函数才会执行动态绑定,在上述代码中给析构函数加上虚函数,则会先调用子类B类的析构函数,再调用父类A类的析构函数。而构造函数则是先调用父类A类的构造函数,再调用子类B类的构造函数,所以最后指针p->a的最终调用的是类B中i的值,为i=2。
2、虚函数、多态、动态绑定
所谓的动态绑定就是基类的指针或者引用有可能指向不同的派生类对象,比如A *p=new B,就是基类A的指针指向派生类B对象,对于非虚函数,执行时实际调用的是该函数的对象类型即是该指针的静态类型,而对于虚函数,执行时实际调用该函数的对象类型为该指针所指对象的实际类型。
由运行结果可以看到,b是一个基类指针,它指向了一个派生类对象,基类Base里面有两个函数,其中test为虚函数,func为非虚函数。因此,对于test(虚函数)就表现为动态绑定,实际调用的是派生类对象中的test,而func为非虚函数,因此它表现为静态绑定,也就是说指针类型是什么,就会调用该类型相应的函数,这里指针p的类型是基类的类型,所以调用Base。
3、总结
虚函数是动态绑定的基础,动态绑定是实现运行多态的基础,
提及多态,主要从(1)动态绑定(基类有虚函数、调用时用指针或者引用),只有虚函数才能实现动态绑定,还有必须通过基类类型的引用或指针进行函数调用。
(2)运行时决定调用哪个
所以如果有1个基类A,3个派生类a,b,c,在A里面有一个虚函数area(),有一个非虚函数func(),类A,a,b,c分别创建对象A1,a1,b1,c1,然后这些对象分别调用area()和func(),结果在A1调用时,会返回A里的这两个函数,a调用时会返回A的非虚函数func(),自己a的area();b调用时会返回A的非虚函数func(),自己b的area();c调用时会返回A的非虚函数func(),自己c的area();在a,b,c的派生类里可以实现重写area()来实现不同的实现方法。
原文:https://www.cnblogs.com/xiaominkang/p/10979089.html