【你问我答】虚函数使用默认实参值由静态类型决定有什么好处?

问题描述:

C++中,虚函数使用默认实参值由静态类型决定有什么好处?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入

------------
#我也有问题想询问牛友,怎么办?

欢迎私信@筱茜 说明你的问题,将根据问题具体情况排期进入【你问我答】专场~
私信请注明参与【你问我答】专场哦~

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#C/C++##悬赏#
全部评论
虚函数的定义: 虚函数为virtual关键字修饰的成员函数,虚函数的作用实现多态性。 一种是基类希望其派生类进行覆盖的函数;另一种是基类希望派生类直接继承而不要改变的函数,对于前者通常定义为虚函数。 静态类型的好处: 调用虚函数使用默认实参时,该实参值由本次调用的静态类型决定,通过基类的引用或指针调用函数,则使用基类中定义的默认实参,即使实际运行的是派生类中的函数版本也是如此。所以如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。
点赞 回复
分享
发布于 2019-08-13 19:26
点赞 回复
分享
发布于 2019-08-13 11:25
英特尔
校招火热招聘中
官网直投
当我们使用基类的引用或指针调用一个虚成员函数时会发生动态绑定,知道运行时才会知道到底调用了哪个版本的虚函数,因此所有的虚函数都必须有定义。  对虚函数的调用可能在运行时才被解析  面向对象编程的核心思想是多态性(polymorphism)。多态性这个词源于希腊语,其含义是“多种形态”,引用或指针的静态类型与动态类型不同这一事实是C++语言支持多态性的根本所在。  当使用基类的引用或指针调用基类中定义的一个函数时,我们并不知道该函数真正作用的对象是什么类型的(可能是基类的对象也可能是派生类的对象)。如果该函数是虚函数,则直到运行时才会确定是哪个版本,判断的依据是引用或指针所绑定的对象的真实类型。  另一方面,非虚函数的调用在编译时进行绑定。类似的,通过对象进行绑定的函数(虚函数或非虚函数)调用也在编译时进行绑定,因为对象的类型是不会改变的。 派生类中的虚函数:  在派生类中覆盖某个虚函数时,可以加上virtual关键字,但是没有必要,因为一个函数被声明为虚函数后,所有派生类中的它都是虚函数,且它的形参类型与返回值类型(一个例外是返回类型是类本身的指针或引用)都和基类中相同。 final和override说明符:  派生类如果定义了一个和基类中的虚函数名字相同但是此参数列表不同的函数时,这依然是合法的行为,但是并不是我们希望的情况。在C++11新标准中可以使用override来说明基类中的虚函数,这么做的好处是使得程序员的意图更清晰的同时让编译器可以发现这一错误:当使用override标记了某个函数,但该函数并没有覆盖已存在的虚函数,编译器将报错。 struct A{     virtual void f1(int) const;     virtual void f2();     void f3(); }; struct B : A {     void f1(int) const override;      //正确     void f2(int) override;            //错误,参数列表不匹配     void f3() override;               //错误,f3不是虚函数     void f4() override;               //错误,A中没有f4() }; 虚函数与默认实参:  和其它函数一样,虚函数也可以拥有默认实参,如果某此函数调用使用了默认实参,则该实参值由本次调用的静态类型决定。也就是说当使用基类的引用或指针调用函数时会使用基类中定义的的默认实参,即使实际上运行的是派生类中的函数版本也是如此,因此虚函数如果使用默认实参,则基类和派生类中定义的默认实参最好是一致的。
点赞 回复
分享
发布于 2019-08-13 13:14

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务