虚拟函数默认参数行为:一个不可预见的难题
在此代码片段中,出现了关于虚拟函数默认参数行为的困境:
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 节中规定,虚拟函数调用的默认参数由表示对象的指针或引用的静态类型确定。在本例中,由于 print 函数是通过 B (bp) 类型的指针调用的,因此使用了 B::print 的默认参数,导致意外的输出。
结论:
通过指针或引用调用虚函数时,必须仔细考虑默认参数行为。指针或引用的静态类型决定了使用哪些默认参数,如果不正确理解,这可能会导致意外结果。
以上是为什么虚拟函数调用继承基类而不是派生类的默认参数?的详细内容。更多信息请关注PHP中文网其他相关文章!