虚拟函数默认参数行为
在提供的 C 代码中,虚拟函数重载和默认参数出现了一种奇怪的情况。让我们探讨这个问题并了解底层机制。
代码定义了两个类,B 和 D,其中 B 有一个默认参数为 10 的虚拟打印方法,D 则使用不同的默认参数 20 覆盖 print当通过指向D类型对象的B类型指针调用print时,未获得“D--data=20”的预期输出。相反,输出显示“D--data=10”。
根据 C 标准 (8.3.6.10),虚拟函数调用使用由指针或引用的静态确定的声明中定义的默认参数类型。这意味着当通过 B 指针调用 print 时,它会继承 B 的默认参数,尽管在 D 中被覆盖。
解释在于指针的静态类型 (B),它决定了默认值虚函数调用期间使用的参数。即使指向的对象是 D 类型,指针的类型决定了默认参数的行为。
因此,为了获得所需的输出“D--data=20”,指针用于调用 print必须是 D 类型以确保使用覆盖的默认参数。
以上是为什么虚拟函数调用从基类而不是派生类继承默认参数?的详细内容。更多信息请关注PHP中文网其他相关文章!