打印

C++ override 关键字用法

[复制链接]
403|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2023-2-28 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • override关键字作用:
    如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。
  • 举例子说明
[color=rgba(0, 0, 0, 0.75)]


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;
    void Dikjstra() override; //无法通过编译,拼写错误,并非重载
    void VNeumann(double g) override; //无法通过编译,参数不一致,并非重载   
void DKnuth() override; //无法通过编译,常量性不一致,并非重载
void Print() override; //无法通过编译,非虚函数重载
};




使用特权

评论回复

相关帖子

沙发
keer_zu|  楼主 | 2023-2-28 09:59 | 只看该作者
  • 如果没有使用override关键字,上面的写法编译可以通过但是运行的效果与真实意愿(希望重载)不符
  • 举例子说明
class testoverride
{
public:
    testoverride(void);
    ~testoverride(void);
    virtual void show() const = 0;
    virtual int infor() = 0;
    virtual void test() = 0;
    virtual int spell() = 0;
};

class B: public testoverride
{
public:
    virtual void show();     //1
    virtual void infor();    //2
    virtual void vmendd();   //3
virtual void test(int x);//4
virtual void splle();    //5
};


上面的1-5个重载函数编译过程中,除了返回值不同的infor会报错以外,其他函数都不会有问题,但是在类实例化的时候会提示是抽象类,因为他们都没有真正实现重载

使用特权

评论回复
板凳
keer_zu|  楼主 | 2023-2-28 09:59 | 只看该作者
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修饰符则可以保证编译器辅助地做一些检查,上面的情况无法通过编译

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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1352

主题

12436

帖子

53

粉丝