赞
踩
c++中,多态的核心,就是希望通过基类访问派生类中重写(overload)的虚方法,来实现不同派生类的不同响应。但虚方法带来一些编程陷阱。如,派生类中继承了基类的虚方法,提供了不同的版本,将会出现隐藏(shadow ),覆盖旧版本。如下:
- class Base{
- public:
- virtual void func(char ch) const {}
- };
-
- class Bingo: public Base{
- public:
- virtual void func(char *ch) const {} //父子类之间,虚函数名相同,类型不同,出现隐藏
- };
由于类Bingo定义的func(char*ch) 而不是func(char ch),将对Bingo对象隐藏基类的func(char ch)。上述的代码在编译时不会提示错误,但是在下面程序不能使用类似于下面的代码:
- Bingo bin;
- bin.func('@'); //报错
上述的情况并不是我们想要的效果,但是编译器又不能识别这样的错误,所以c++11中添加了override,final说明符来管理虚方法。
在成员函数声明或定义中,override
确保该函数为虚函数并重写(overload)某个基类中的虚函数。若此非真则程序非良构(生成编译错误)。override 是在成员函数声明符之后使用时拥有特殊含义的标识符:其他情况下它不是保留的关键词。
- struct A{
- virtual void foo();
- void bar();
- };
- struct B{
- void foo() const override; //错误,B::foo 不重写A::foo();
- void foo() override; //正确
- void bar() override; //错误 A::bar()不是虚函数
- };
C++11的关键字final有两个用途:(1)、禁止虚函数被重写;(2)、禁止基类被继承。
在派生类中,可以同时使用overried和final。
- struct Base {
- virtual void foo();
- };
- struct A : Base {
- virtual void foo() final; // A::foo is final
- // void bar() final; // Error: non-virtual function cannot be final
- };
- struct B final : A { // struct B is final
- // void foo(); // Error: foo cannot be overridden as it's final in A
- };
- // struct C : B { }; // Error: B is final
-
- struct A_ {
- virtual void func() const;
- };
- struct B_ : A_ {
- void func() const override final; //OK
- };
- // struct C_ : B_ { void func()const; }; //error, B::func is final
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。