这是一个坏主意,因为您获得的默认参数将取决于对象的静态类型,而virtual分派到的函数将取决于动态类型。也就是说,当您使用默认参数调用函数时,无论该函数是否存在,默认参数都会在编译时被替换virtual。@cppcoder在他的[已关闭] 问题中提供了以下示例:struct A { virtual void display(int i = 5) { std::cout << "Base::" << i << "\n"; }};struct B : public A { virtual void display(int i = 9) override { std::cout << "Derived::" << i << "\n"; }};int main(){ A * a = new B(); a->display(); A* aa = new A(); aa->display(); B* bb = new B(); bb->display();}产生以下输出:Derived::5Base::5Derived::9借助上面的解释,很容易看出原因。在编译时,编译器将从指针的静态类型的成员函数中替换默认参数,从而使该main函数等效于以下内容: A * a = new B(); a->display(5); A* aa = new A(); aa->display(5); B* bb = new B(); bb->display(9);