一、在基类的某函数中调用虚函数的情况:
依然是动态绑定的,依然取决于基类指针实际指向的对象类型!
如:
派生类重写了虚函数print();
仅在基类的test()函数调用print()
实际输出:Child
说明即使是在基类的某函数中调用虚函数,仍然要看对象的实际类型,是动态绑定的!
二、虚函数带默认实参的情况:
当虚函数有默认实参的时候,这个实参的默认值将在编译时确定,当调用虚函数的时候如果此参数没传入,那么默认值将使用“调用该虚函数的对象类型(并不是实际类型)来确定”!即不随动态绑定!与对象实际类型无关!
比如:
(1)如果基类类指针调用了这个虚函数并不传参,那么参数的默认值是派生类里声明的值,而不管此基类指针实际指向了基类还是派生类!
(2)如果派生类指针调用了这个虚函数并不传参,那么参数默认值是派生类里声明的值。
一个程序:
基类的虚函数:print(),默认实参值=0
派生类重写了虚函数print(),默认实参值=100
输出为:Child:0 而不是100!
默认实参的默认值是编译时确定的,由于b是Base类型指针,所以这里的i默认值 = Base类中print的i默认值,也就是0
所以,尽量让派生类虚函数的默认实参与基类的一致~
虚函数的若干细节
原文:https://www.cnblogs.com/cppdaixiecs/p/12149340.html