1、final关键字
C++ 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写,和 Jave 的 final 关键字的功能是类似的。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。
- C++新标准规定:如果我们定义的类不希望被其他类继承,那么可以在类名后加一个final关键字,但是final类仍然可以继承其他类。
- 实际上C++11的关键字final有两个用途。第一,它阻止了从类继承;第二,阻止一个虚函数的重载。
1.1 、final修饰类
被final修饰的类不能作为派生类,也就是说不能被其他类所继承。
class Grandpa
{
public:
virtual void TestFunc()
{
std::cout << "Grandpa Class";
}
};
class Dad final:Grandpa
{
public:
virtual void TestFunc()
{
std::cout << "Dad Class";
}
};
class Child final :Dad
{
public:
virtual void TestFunc()
{
std::cout << "Child Class";
}
};
在这里Dad 类是被final修饰的,所以Dad不能作为派生类,此时Child类不能继承于Dad类。
1.2、final修饰函数
final除了修饰类,也能修饰函数,不能只能修饰虚函数,被修饰的虚函数禁止了子类对虚函数的重写
class Grandpa
{
public:
virtual void TestFunc() final
{
std::cout << "Grandpa Class";
}
};
class Dad:Grandpa
{
public:
virtual void TestFunc()
{
std::cout << "Dad Class";
}
};
在上述代码中,Grandpa类的虚函数TestFunc被final关键字修饰,子类Dad继承于Grandpa类,当子类Dad重写TestFunc函数将报错,子类Dad只能使用父类Grandpa实现的TestFunc函数。
2、override关键字
在C++的重载中,对于基类声明为virtual的函数,派生类的重载版本不再需要声明该函数为virtual,即使认为的写上virtual,编译器也会对此进行忽略。虽然这样的特性对程序员来说带来了一定的便利性,有得必有失,带来便利的同时,也造成了阅读上的一些困难。程序员无法从派生类对该函数的定义中判断出此函数是虚函数还是非虚函数。
对此,在C++11中引入了override关键字,如果在派生类的虚函数中使用了override关键字,基类中必须重载同名的函数,否则将无法通过编译。override关键字使得程序员可以明确的知道派生类中哪些函数是基类定义的虚函数。
class Grandpa
{
public:
virtual void TestFunc()
{
std::cout << "Grandpa Class";
}
};
class Dad:Grandpa
{
public:
virtual void TestFunc() override
{
std::cout << "Dad Class";
}
};
Grandpa的派生类Dad重写了虚函数TestFunc,当程序员写错虚函数名时,编译器将会提示语法错误。