c++管理虚方法之override和final

零,背景

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说明符

在成员函数声明或定义中,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()不是虚函数
};

二,final说明符

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值