在 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; }
预期输出:
[ D--data=20 ]
实际输出:
[ D--data=10 ]
说明:
根据 C 标准(8.3.6.10),通过指针或引用调用虚函数时,默认参数派生自指针或引用的静态类型,而不是派生类的重写函数。
在这种情况下,bp 是 B 类型的指针,因此使用 B::print 的默认参数(即 10),覆盖 D::print 的默认参数(即 20)。
因此,输出为 D--data=10,而不是预期的 D--data=20。
以上是为什么虚拟函数的默认参数使用基类的值而不是派生类的值?的详细内容。更多信息请关注PHP中文网其他相关文章!