Рубрики

C ++ финальный спецификатор

Cast all your worries on him,
because he cares for you.
1 Peter 5: 7 (Bible)

В Java мы можем использовать final для функции, чтобы убедиться, что она не может быть переопределена. Мы также можем использовать final в Java, чтобы убедиться, что класс не может быть унаследован. Точно так же последний стандарт C ++ C ++ 11 добавил финал.

Использование финального спецификатора в C ++ 11:
Иногда вы не хотите, чтобы производный класс переопределял виртуальную функцию базового класса. C ++ 11 позволяет встроенным средствам предотвратить переопределение виртуальной функции, используя финальный спецификатор.
Рассмотрим следующий пример, который показывает использование финального спецификатора. Эта программа не в процессе компиляции.

#include <iostream>

using namespace std;

  

class Base

{

public:

    virtual void myfun() final

    {

        cout << "myfun() in Base";

    }

};

class Derived : public Base

{

    void myfun()

    {

        cout << "myfun() in Derived\n";

    }

};

  

int main()

{

    Derived d;

    Base &b = d;

    b.myfun();

    return 0;

}

Выход:

prog.cpp:14:10: error: virtual function ‘virtual void Derived::myfun()’
     void myfun()
          ^
prog.cpp:7:18: error: overriding final function ‘virtual void Base::myfun()’
     virtual void myfun() final 

2-е использование окончательного спецификатора:
Последний спецификатор в C ++ 11 также может быть использован для предотвращения наследования класса / структуры. Если класс или структура помечены как окончательные, то они становятся не наследуемыми и не могут использоваться в качестве базового класса / структуры.
Следующая программа показывает использование финального спецификатора, чтобы сделать класс не наследуемым:

#include <iostream>

class Base final

{
};

  

class Derived : public Base

{
};

  

int main()

{

    Derived d;

    return 0;

}

Выход:

error: cannot derive from ‘final’ base ‘Base’ in derived type ‘Derived’
 class Derived : public Base

финал в C ++ 11 против Java
Обратите внимание, что использование окончательного спецификатора в C ++ 11 такое же, как в Java, но Java использует final перед именем класса, в то время как final спецификатор используется после имени класса в C ++ 11. Аналогичным образом Java использует ключевое слово final в начале определения метода (перед возвращаемый тип метода), но C ++ 11 использует финальный спецификатор после имени функции.

class Test

{

    final void fun()// использование final в Java

    { }

}

class Test

{

public:

    virtual void fun() final // использование final в C ++ 11

    {}

};

В отличие от Java, final не является ключевым словом в C ++ 11. final имеет значение только при использовании в вышеприведенных контекстах, в противном случае это просто идентификатор.
Одной из возможных причин, по которой ключевое слово не является окончательным, является обеспечение обратной совместимости. Могут существовать производственные коды, которые используют final для других целей. Например, следующая программа компилируется и запускается без ошибок.

#include <iostream>

using namespace std;

  

int main()

{

    int final = 20;

    cout << final;

    return 0;

}

Выход:

20

В Java финал также может использоваться с переменными, чтобы убедиться, что значение может быть назначено только один раз. такое использование final отсутствует в C ++ 11.

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

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

C ++ финальный спецификатор

0.00 (0%) 0 votes