C++虚函数的默认参数是静态绑定还是动态绑定
或者问:是在编译阶段确定的还是在运行阶段确定的
答案是:编译阶段,也就是静态绑定的
#include <iostream>class Base
{
public:virtual void func(int x = 10) {std::cout << "Base::func(" << x << ")" << std::endl;}
};class Derived : public Base
{
public:void func(int x = 20) override {std::cout << "Derived::func(" << x << ")" << std::endl;}
};int main()
{Base* ptr; // 指向基类的指针Derived obj;ptr = &obj; // 指向派生类的对象// 调用虚函数 func 产生多态ptr->func(); //10obj.func();//20 无多态return 0;
}
首先在函数调用之前会先把参数入栈,然后才会找要调用的函数入口地址;
所以当编译器根据类型进行编译时,它会去对应类型的类里面找函数,找默认参数,然后入栈,
ptr->func() ; ptr在编译时编译器认为时Base 类型,所以就去Base里拿默认参数,这里不牵涉到虚函数表指针vfptr和虚函数表vftable,因为参数没有多态性,而函数才有多态;多态产生的一个必要条件就是:基类指针或引用指向了一个派生类对象。