📜  默认参数和虚函数

📅  最后修改于: 2021-05-25 20:03:11             🧑  作者: Mango

预测以下C++程序的输出。

#include 
using namespace std;
  
class Base
{
public:
    virtual void fun ( int x = 0 )
    {
        cout << "Base::fun(), x = " << x << endl;
    }
};
  
class Derived : public Base
{
public:
    virtual void fun ( int x )
    {
        cout << "Derived::fun(), x = " << x << endl;
    }
};
  
  
int main()
{
    Derived d1;
    Base *bp = &d1;
    bp->fun();
    return 0;
}

输出:

Derived::fun(), x = 0

如果仔细看一下输出,就会发现派生类的fun()被调用,基类fun()的默认值被使用。
默认参数不参与函数签名。因此,基类和派生类中fun()的签名被认为是相同的,因此基类的fun()被覆盖。同样,默认值在编译时使用。当编译器发现函数调用中缺少参数时,它将替换给定的默认值。因此,在上述程序中,x的值在编译时被替换,并在运行时调用派生类的fun()。

现在预测以下程序的输出。

#include 
using namespace std;
  
class Base
{
public:
    virtual void fun ( int x = 0)
    {
        cout << "Base::fun(), x = " << x << endl;
    }
};
  
class Derived : public Base
{
public:
    virtual void fun ( int x = 10 ) // NOTE THIS CHANGE
    {
        cout << "Derived::fun(), x = " << x << endl;
    }
};
  
  
int main()
{
    Derived d1;
    Base *bp = &d1;
    bp->fun();
    return 0;
}

该程序的输出与先前的程序相同。原因相同,在编译时将替换默认值。 fun()在bp上调用,bp是Base类型的指针。因此,编译器将其替换为0(而不是10)。

通常,最佳做法是避免使用虚函数中的默认值,以免造成混淆(有关更多详细信息,请参见此内容)

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”