在effective C++中提到C++没有Java那样的final classes的禁止派生的机制,遂想到在C++ Primer中好像提到过final说明符,正好就连带着override说明符一起复习一下了。
首先介绍一下在继承当中,如果派生类定义了一个与基类中虚函数同名但是形参列表不同的函数,编译器会认为这是合法的行为,这两个函数是独立的两个函数,这时派生类的函数并没有覆盖掉基类中的版本。但是可能存在这样一种问题:我们本来希望是对于基类函数的重载,但是不小心弄错了形参列表。这个时候就体现了override说明符的作用了。
如果使用了override说明符,则表明我们希望这个函数可以覆盖基类中的同名虚函数,因此如果出现了形参列表不同的问题,编译器就会报错。
另外需要注意的是,只有虚函数才可以被覆盖,如果在子类中对基类中的非虚函数使用override同样也会报错。
与override说明符相对,如果我们将类中的某个成员函数指定为final,则之后任何试图覆盖该函数的行为都将引发错误。对于final说明符的使用则不限定于虚函数,也就是说如果在基类中使用了final说明符,是不允许派生类中声明同一个函数的
确实可以看到C++中虽然有final说明符,但是并不是用于防止派生类的产生,而是用于单个成员函数的覆盖问题。
另外,如果我们不希望非虚析构函数被继承,可以将其声明为final。但是这个和使用继承的初衷相悖,我们在设计一个类的时候就应当考虑到这个类是否会被继承,因此在设计之初就应该考虑这个析构函数是否应当设计成虚函数。