在派生类中时,很容易在无意中创建一个新的虚函数的派生类中时,你实际上是在重写基类的函数。当你不正确的比赛在派生类和基类中的一个函数原型。比如说呢。
当这一切发生的时候,它可以很容易使一个函数调用a()或b()和期望得到的衍生版本但最终得到的基础版代替。
这个现象也能轻易发生当您添加了一个新的参数在基地的功能而忘了更新派生版本。当这种情况发生时,该功能是一个重写的派生的不再是一个重写你的代码,和神秘地停止工作。这类问题很难找到,因为他们是如此的变化触发看起来无害的。
C + + 11引入了一个新的标识符,称为覆盖允许你明确你想要的功能覆盖标记。如果函数没有重载,编译器会抱怨。比如说呢。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
阶级基础
{
虚拟的空隙(浮动= 0);
虚b() const;
虚c();
无效的d();
};
派生类:公共基础
{
虚拟的空隙(int = 0)覆盖;/编译错误,因为派生类::一个(int)不会覆盖基地::一个(浮动)
虚b()覆盖;/编译错误,因为派生类::b()不会覆盖基地::b() const
虚c()覆盖;// OK!来源::::c() c()覆盖基地
无效的d()覆盖;/编译错误,因为派生类::d()不会覆盖基地
虽然使用override标识符不是必需的,它是强烈建议,因为它将有助于防止无意的错误。
(如果你想知道为什么这是作为一个标识符,而不是一个关键词,实现我假定这是这样做的,名为“重写”可以作为在其他情况下,一个正常的变量名。如果它被定义为一个关键词,它会在所有的情况下被保留,这可能会破坏现有的应用程序)
最后的
有偶尔的时候,你不想让别人来重写虚函数,或者创建一个派生类。C + + 11将最终提供此功能的标识符。
下面的示例演示的最后标识符使非忽略的使用功能:
1
2
3
4
5
6
7
8
9
阶级基础
{
虚a()最终;/ /最后的标识符标记该函数作为非忽略
};
派生类:公共基础
{
虚a();/试图重写函数库::a()最终将导致编译器错误
};
最后的标识也可以用在类使其非遗传的:
1
2
3
4
5
6
7
阶级基础最终/最后的标识标志着这类不可继承
{
};
派生类:公共基础/试图重写final类基地将导致编译器错误
{
};
有一些正当的理由,最终使函数或类。例如,最终最常见的用途是确保一个不可变类保持不变。一个不可变类是专门设计的类的状态不能被创建后,改性。没有最终的标识符,派生类可以使类成为可变的功能。如果基类是最终的,不能将它的子类,这是不可避免的。
然而,一般来说,除非你有很好的理由,最后通常应该避免使用。如果你使用关键字,文件的原因,因为它可能不是很明显的继承你的代码的人。
默认
默认情况下,C++将提供一个默认构造函数,拷贝构造函数,赋值操作符(==操作符)和析构函数。如果你为你的类的所有这些功能替换版本,C++没有提供默认版本。然而,在C + + 11,你现在可以指定您希望编译器提供一个默认的吧。这是通过原型的功能和使用默认的说明符做