虚函数默认参数行为

我对以下代码有一个奇怪的情况。请帮助我弄清楚它。


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 ]

请帮忙。对于您来说,这似乎很明显,但我不了解其内部机制。


慕码人2483693
浏览 436回答 3
3回答

Qyouu

默认参数完全是编译时功能。即在编译时执行默认参数的替换,以代替缺少的参数。因此,显然,成员函数的默认参数选择不可能取决于对象的动态(即运行时)类型。它始终取决于对象的静态(即编译时)类型。您在代码示例中编写的调用将立即被编译器解释为bp->print(10)与其他无关。

UYOU

标准说(8.3.6.10):虚函数调用(10.3)在虚函数的声明中使用默认参数,该声明由表示对象的指针或引用的静态类型确定。派生类中的重写函数不会从其重写的函数中获取默认参数。这意味着,由于您要print通过类型的指针进行调用B,因此它将使用默认参数B::print。

慕姐8265434

通常,使用在特定范围内可见的那些默认参数。您可以(但不应该)做一些时髦的事情:#include <iostream>void frob (int x) {&nbsp; &nbsp; std::cout << "frob(" << x << ")\n";}void frob (int = 0);int main () {&nbsp; &nbsp; frob();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// using 0&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; void frob (int x=5) ;&nbsp; &nbsp; &nbsp; &nbsp; frob();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// using 5&nbsp; &nbsp; }&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; void frob (int x=-5) ;&nbsp; &nbsp; &nbsp; &nbsp; frob();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// using -5&nbsp; &nbsp; }}在您的情况下,基类签名是可见的。为了使用派生的默认参数,您必须通过指向派生类的指针显式调用该函数,方法是这样声明或正确地对其进行强制转换。
打开App,查看更多内容
随时随地看视频慕课网APP