虚函数默认参数行为

pap*_*ane 34 c++

我对以下代码有一个奇怪的情况.请帮我澄清一下.

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;
}
Run Code Online (Sandbox Code Playgroud)

关于我预期的输出

[ D--data=20 ]
Run Code Online (Sandbox Code Playgroud)

但实际上它是

[ D--data=10 ]
Run Code Online (Sandbox Code Playgroud)

请帮忙.这对你来说似乎很明显,但我不了解内部机制.

Bjö*_*lex 32

标准说(8.3.6.10):

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

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


AnT*_*AnT 25

默认参数完全是编译时功能.即,在编译时执行默认参数替换缺少参数的替换.因此,显然,成员函数的默认参数选择无法依赖于对象的动态(即运行时)类型.它总是依赖于对象的静态(即编译时)类型.

您在代码示例中编写的调用会立即被编译器解释为bp->print(10)无论其他什么.