在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等的更多准备工作,请参阅“完整面试准备课程” 。