为了账号安全,请及时绑定邮箱和手机立即绑定

虚函数默认参数行为

虚函数默认参数行为

C++
慕码人2483693 2019-10-31 12:50:44
我对以下代码有一个奇怪的情况。请帮助我弄清楚它。class B{       public:            B();            virtual void print(int data=10)            {                  cout << endl << "B--data=" << data;            }};class D:public B{       public:            D();            void print(int data=20)            {                  cout << endl << "D--data=" << data;            }};int main(){     B *bp = new D();     bp->print();return 0;}关于我期望的输出[ D--data=20 ]但是实际上[ D--data=10 ]请帮忙。对于您来说,这似乎很明显,但我不了解其内部机制。
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

默认参数完全是编译时功能。即在编译时执行默认参数的替换,以代替缺少的参数。因此,显然,成员函数的默认参数选择不可能取决于对象的动态(即运行时)类型。它始终取决于对象的静态(即编译时)类型。


您在代码示例中编写的调用将立即被编译器解释为bp->print(10)与其他无关。


查看完整回答
反对 回复 2019-10-31
?
UYOU

TA贡献1878条经验 获得超4个赞

标准说(8.3.6.10):


虚函数调用(10.3)在虚函数的声明中使用默认参数,该声明由表示对象的指针或引用的静态类型确定。派生类中的重写函数不会从其重写的函数中获取默认参数。


这意味着,由于您要print通过类型的指针进行调用B,因此它将使用默认参数B::print。


查看完整回答
反对 回复 2019-10-31
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

通常,使用在特定范围内可见的那些默认参数。您可以(但不应该)做一些时髦的事情:


#include <iostream>

void frob (int x) {

    std::cout << "frob(" << x << ")\n";

}


void frob (int = 0);

int main () {

    frob();                     // using 0

    {

        void frob (int x=5) ;

        frob();                 // using 5

    }

    {

        void frob (int x=-5) ;

        frob();                 // using -5

    }

}

在您的情况下,基类签名是可见的。为了使用派生的默认参数,您必须通过指向派生类的指针显式调用该函数,方法是这样声明或正确地对其进行强制转换。


查看完整回答
反对 回复 2019-10-31
  • 3 回答
  • 0 关注
  • 435 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信