面试题:C++ 虚函数的默认参数是动态绑定的吗?

旅行   2024-10-09 11:55   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取
,免费分享。 欢迎V:fb964919126







C++ 虚函数的默认参数是动态绑定的吗?





答案:虚函数是动态绑定的,而其默认的参数是静态绑定。


01

代码示例

#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();
return 0;}

在这个例子中,运行后24行输出:Derived::func(10)

可以发现:

在基类 Base 中定义的 func 函数具有默认参数 x = 10。

在派生类 Derived 中重写了 func 函数,并提供了新的默认参数 x = 20。

然而,当通过基类指针 ptr 调用 func 函数时,编译器会根据 ptr 的类型(即基类 Base)来解析默认参数。因此,编译器使用基类中定义的默认参数 x = 10。

02

虚函数:函数体动态绑定,默认参数静态绑定


虚函数的特点是能够在运行时根据对象的实际类型动态绑定到正确的函数实现。要触发虚函数的动态绑定,必须通过基类类型的指针或引用进行函数调用。然而,虚函数中的默认参数值是在编译时静态赋值的,因此不会根据对象的实际类型改变‌。


如果基类中的虚函数定义了默认参数,那么在派生类中重写该函数时指定的默认参数值会被忽略。编译器会默认调用基类中的函数,而不是派生类中重写时指定了默认参数值的函数‌。


总结:

基类中虚函数的默认参数,是静态绑定的,子类不要进行重新定义。

end



CppPlayer 



关注,回复【电子书】珍藏CPP电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

CppPlayer
一个专注面试题拆解的公众号
 最新文章