📜  C++最终说明符

📅  最后修改于: 2021-05-30 01:58:01             🧑  作者: Mango

在Java,我们可以对函数使用final来确保它不会被覆盖。我们还可以在Java使用final来确保不能继承类。同样,最新的C++标准C++ 11添加了final。
在C++ 11中使用最终说明符:
有时,您不想允许派生类重写基类的虚函数。 C++ 11允许使用内置工具来防止使用最终说明符覆盖虚拟函数。

考虑以下示例,该示例显示了最终说明符的用法。该程序编译失败。

CPP
#include 
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;
}


CPP
#include 
class Base final
{
};
 
class Derived : public Base
{
};
 
int main()
{
    Derived d;
    return 0;
}


CPP
class Test
{
    final void fun()// use of final in Java
    { }
}
class Test
{
public:
    virtual void fun() final //use of final in C++ 11
    {}
};


CPP
#include 
using namespace std;
 
int main()
{
    int final = 20;
    cout << final;
    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 

最终说明符的第二次使用:
C++ 11中的final指定符也可以用于防止类/结构的继承。如果将一个类或结构标记为final,则它将变为不可继承的并且不能用作基类/结构。

以下程序显示了使用最终说明符使类不可继承:

CPP

#include 
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中使用final指示符与Java相同,但Java在类名称之前使用final指示符,而C++ 11中在类名称之后使用final指示符。同样, Java在方法定义的开头使用final关键字(在返回方法的类型),但C++ 11在函数名称后使用最终说明符。

CPP

class Test
{
    final void fun()// use of final in Java
    { }
}
class Test
{
public:
    virtual void fun() final //use of final in C++ 11
    {}
};

与Java不同,final不是C++ 11中的关键字。final仅在以上上下文中使用时才有意义,否则仅是标识符。
不使final为关键字的一种可能原因是确保向后兼容。可能存在将final用于其他目的的生产代码。例如,以下程序编译并运行时没有错误。

CPP

#include 
using namespace std;
 
int main()
{
    int final = 20;
    cout << final;
    return 0;
}

输出:

20

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