虚拟函数中意外的默认参数行为:了解根本原因
在此代码片段中,您遇到与默认值相关的有趣问题虚函数的参数。尽管预期输出为“D--data=20”,但您却观察到“D--data=10”。让我们深入研究内部机制以理解根本原因。
在您的示例中,您有两个类 B 和 D,它们具有一个名为 print 的虚函数,该函数采用默认参数。在 D 类中,您重写 print 函数并提供不同的默认参数。当您创建 D 的实例时,您通过指向 B 的指针访问打印函数。
根据 C 标准 (8.3.6.10),“虚拟函数调用使用声明中的默认参数虚函数由表示对象的指针或引用的静态类型确定。”这意味着,当通过指向基类的指针调用虚函数时,它使用基类声明中定义的默认参数,而不管派生类中重写的默认参数如何。
因此,当您调用通过指针bp打印,默认参数由bp的静态类型决定,即B。因此,使用B::print的默认参数,导致输出“D--data=10”而不是预期的“D--data=20。”
以上是为什么虚拟函数的默认参数使用基类值?的详细内容。更多信息请关注PHP中文网其他相关文章!