一、C++ 继承的控制
在 C++11 之前,一直没有控制继承的关键字。想要禁止一个类派生很麻烦,想要禁止派生类中重载某个虚函数也很麻烦。因此 C++ 11 添加了两个控制继承的关键字:
final
禁止类继承、禁止虚函数重载override
显式声明为重载虚函数
二、final
1. 禁止类继承
class B {/*..*/} final;
class D: public B {
}; //compilation error: base class TaskManager is final
2. 禁止虚函数重载
class A
{
pulic:
virtual void func() final;
};
class B: public A
{
pulic:
void func() const; // error, A::func is final
};
三、override
关于派生类重载基类的虚函数,有两个常见问题:
-
无意中重载
本意想在派生类中新增一个函数,结果声明了一个与基类的某个虚函数具有相同名字和参数的函数,无意中实现了基类虚函数的重载 -
无意中新增函数
本意想在派生类中重载基类虚函数,结果由于参数不小心写的不一样导致变成了声明一个新函数,并没有实现基类虚函数的重载
这种情况不是所有的编译器都会给个警告或错误,override
关键字明确地表示此函数是对基类中一个虚函数的重载,编译器会检查该派生类函数在基类虚函数中是否能找到匹配的,如果不能则编译器报错误信息
class B
{
public:
virtual void func(int);
};
class D : public B
{
public:
void func(double) override; // compilation error
};