📜  C++ 中的默认参数和虚函数

📅  最后修改于: 2022-05-13 01:55:17.286000             🧑  作者: Mango

C++ 中的默认参数和虚函数

我们先来了解一下默认参数和虚函数是什么意思。

默认参数:这些是在函数声明期间提供的值,如果没有参数传递给它们,则可以自动分配值。如果传递了任何值,则默认值将被覆盖。

虚函数:虚函数是在基类中声明并由派生类重新定义(覆盖)的成员函数。当您使用指针或对基类的引用来引用派生类对象时,您可以为该对象调用虚函数并执行派生类的函数版本。

要查看默认参数与虚函数的组合应用,请先查看以下 C++ 程序,

CPP
// CPP program to demonstrate how default arguments and
// virtual function are used together
#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;
    }
};
  
// Driver Code
int main()
{
    Derived d1;
    Base* bp = &d1;
    bp->fun();
    return 0;
}


CPP
// CPP program to demonstrate how default arguments and
// virtual function are used together
#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;
}


输出
Derived::fun(), x = 0

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

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

CPP

// CPP program to demonstrate how default arguments and
// virtual function are used together
#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;
}
输出
Derived::fun(), x = 0

该程序的输出与上一个程序相同。道理是一样的,编译时替换掉默认值。 fun() 在 'bp' 上调用,它是 Base 类型的指针。所以编译器替换为 0(不是 10)。