override关键字

在学习设计模式的时候接触到了 override 关键字,查看相关资料后整理如下。



Override 关键字作用

如果派生类在虚函数声明时使用了 override 描述符,那么该函数必须 重写 其基类中的同名函数。否则代码将无法通过编译。



举例说明

struct Base {
    virtual void Turing() = 0;
    virtual void Dijkstra() = 0;
    virtual void VNeumann(int g) = 0;
    virtual void DKnuth() const;
    void Print();
};

struct DerivedMid: public Base {
    // void VNeumann(double g);
    //接口被隔离了,曾想多一个版本的VNeumann函数
};

struct DerivedTop : public DerivedMid {
    void Turing() override;            //1.
    void Dikjstra() override;          //2.无法通过编译,拼写错误,并非重载
    void VNeumann(double g) override;  //3.无法通过编译,参数不一致,并非重写    
	void DKnuth() override;            //4.无法通过编译,常量性不一致,并非重写
	void Print() override;             //5.无法通过编译,非虚函数重写
};

上面的 1 − 5 1-5 15 重写函数编译过程中,除了返回值不同的情况会报错以外,其他函数都不会有问题。

但是在类实例化的时候会提示是抽象类,因为他们都没有真正实现重载C:

class C: public testoverride
{
public:
    virtual void show() override;
    virtual void infor() override;   
    virtual void vmendd() override;
    virtual void test(int x) override;
    virtual void splle() override;
};

添加了 override 以后,会在编译器override修饰符则可以保证编译器辅助地做一些检查,上面的情况无法通过编译,详细案例见:C++ 中提供的override 关键字。也就是说使用 override 关键字可以防止对不该进行重写的函数进行误重写,是个良好的编程习惯;



结论

  • 如果派生类里面需要重写虚函数,那么加上关键字 override,这样编译器就可以辅助检查是不是正确重写,如果没加这个关键字 也没什么严重的 error 只是少了编译器检查的安全性;

以下内容和《Effective C++》条款34: 区分接口继承和实现继承 有内容交叉:

  • 基类中使用纯虚函数,则派生类则是从基类继承接口,并且必须在类中对该接口进行实现;
  • 基类中使用普通虚函数,则派生类是从基类继承接口和缺省实现,如果派生类重写该接口,则使用派生类的实现,如果没有,则使用基类的缺省实现,而override常使用在此情况中,最好建议在派生类中需要重写的函数声明之后增加关键字override,避免出现逻辑错误;
  • 基类中使用普通函数,则派生类是从基类继承接口和强制实现,不建议修改继承自基类的非虚函数;
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值