Рубрики

Аргументы по умолчанию и виртуальная функция

Предсказать вывод следующей программы на C ++.

#include <iostream>

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 <iostream>

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 ) // Обратите внимание на это изменение

    {

        cout << "Derived::fun(), x = " << x << endl;

    }

};

  

  

int main()

{

    Derived d1;

    Base *bp = &d1;

    bp->fun();

    return 0;

}

Вывод этой программы такой же, как и в предыдущей программе. Причина та же, значение по умолчанию подставляется во время компиляции. Fun () вызывается на bp, который является указателем типа Base. Таким образом, компилятор заменяет 0 (не 10).

Как правило, во избежание путаницы рекомендуется избегать значений по умолчанию в виртуальных функциях (см. Это для получения дополнительной информации).

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Аргументы по умолчанию и виртуальная функция

0.00 (0%) 0 votes