c++的override关键字什么意思

https://zhidao.baidu.com/question/1510000185533778300.html

在C++11中为了帮助程序员写继承结构复杂的类型,引入了虚函数描述符override,如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。我们来看一下如代码清单2-25所示的这个简单的例子。

代码清单2-25

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;              // 无法通过编译,非虚函数重载
};
// 编译选项:g++ -c -std=c++11 2-10-3.cpp
在代码清单2-25中,我们在基类Base中定义了一些virtual的函数(接口)以及一个非virtual的函数Print。其派生类DerivedMid中,基类的Base的接口都没有重载,不过通过注释可以发现,DerivedMid的作者曾经想要重载出一个“void VNeumann(double g)”的版本。这行注释显然迷惑了编写DerivedTop的程序员,所以DerivedTop的作者在重载所有Base类的接口的时候,犯下了3种不同的错误:
函数名拼写错,Dijkstra误写作了Dikjstra。
函数原型不匹配,VNeumann函数的参数类型误做了double类型,而DKnuth的常量性在派生类中被取消了。
重写了非虚函数Print。
如果没有override修饰符,在代码清单2-25中,DerivedTop作者的4处可以编译过去 但是与他的愿意(想重载虚函数)有严重的偏差了 但是编译器不报错,继续编译下去 这样就难排查了。加上关键字override 这样编译器可以辅助检查是不是正确重载 。如果没有override修饰符 DerivedTop的作者可能在编译后都没有意识到自己犯了这么多错误。因为编译器对以上3种错误不会有任何的警示。这里override修饰符则可以保证编译器辅助地做一些检查。我们可以看到,在代码清单2-25中,DerivedTop作者的4处错误都无法通过编译。
此外,值得指出的是,在C++中,如果一个派生类的编写者自认为新写了一个接口,而实际上却重载了一个底层的接口(一些简单的名字如get、set、print就容易出现这样的状况),出现这种情况编译器还是爱莫能助的。不过这样无意中的重载一般不会带来太大的问题,因为派生类的变量如果调用了该接口,除了可能存在的一些虚函数开销外,仍然会执行派生类的版本。因此编译器也就没有必要提供检查“非重载”的状况。而检查“一定重载”的override关键字,对程序员的实际应用则会更有意义。
还有值得注意的是,如我们在第1章中提到的,final/override也可以定义为正常变量名,只有在其出现在函数后时才是能够控制继承/派生的关键字。通过这样的设计,很多含有final/override变量或者函数名的C++98代码就能够被C++编译器编译通过了。但出于安全考虑,建议读者在C++11代码中应该尽可能地避免这样的变量名称或将其定义在宏中,以防发生不必要的错误。
建议:如果派生类里面是像重载虚函数 就加上关键字override 这样编译器可以辅助检查是不是正确重载,如果没加这个关键字 也没什么严重的error 只是少了编译器检查的安全性
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C++ 中的 override 关键字表示一个函数是对基类中的虚函数的重写,它用来告诉编译器检查是否存在一个具有相同签名的虚函数,如果存在则覆盖,如果不存在则报错。 例如: ``` class Base { public: virtual void foo() { ... } }; class Derived : public Base { public: void foo() override { ... } }; ``` 在上面的代码中,Derived 类中的 foo 函数对基类中的 foo 函数进行了重写。 注意:C 语言没有 override 关键字。 ### 回答2: C++中的override关键字用于明确表示子类重写父类的虚函数。 当子类中的函数与父类中的虚函数签名相同,并在子类中使用override关键字进行声明时,编译器会对其进行检查,确保该函数确实是在子类中重写了父类的虚函数。 使用override关键字的好处有以下几点: 1. 书写风格清晰明确:通过在函数声明末尾添加override关键字,可以让其他开发人员清楚地知道该函数是重写了父类的虚函数,而不是一个新的函数。 2. 编译器检查:使用override关键字可以告诉编译器该函数应该是重写了父类的虚函数,编译器将会在编译时进行检查,如果发现该函数并没有重写任何父类的虚函数,则会给出错误提示。 3. 避免编码错误:在子类中重写父类的虚函数时,可能会因为拼写错误或者参数不匹配等原因导致错误,使用override关键字可以帮助开发人员更容易地发现这些错误,并对其进行修正。 需要注意的是,使用override关键字只能用于重写父类的虚函数,不能用于重写非虚函数或者静态函数。另外,override关键字只是一种语法上的约束,并不会影响程序的运行时行为,它主要是为了提高代码的清晰性和可读性,以及帮助开发人员发现和修正潜在的错误。 ### 回答3: C++中的override关键字用于显式地指示一个函数是覆盖(override)了基类中的虚函数。它在C++11及以后的版本中引入。 当我们在派生类中声明一个函数时,如果该函数与基类中的某个虚函数具有相同的函数签名(即函数名及参数列表相同),我们可以在派生类中使用override关键字显式地声明该函数覆盖了基类中的虚函数。这样做的好处是能够提高代码的可读性和可维护性。 使用override关键字的好处在于,它可以帮助我们在编译时捕获一些潜在的错误。一旦我们错误地重写了一个没有虚函数特性的函数(比如函数名拼写错误或参数列表不一致),编译器就会报错,帮助我们检查并修正这些错误。 此外,通过使用override关键字,我们还可以避免在派生类中意外地引入新的虚函数。如果我们在派生类中声明一个函数,希望它覆盖了基类中的虚函数,但是由于函数签名不匹配的原因,它最终成为了一个新的虚函数,这往往会导致程序逻辑错误。 总之,override关键字C++中为了增强可读性和可维护性而引入的一个特性。它可以用于显示地告知编译器,某个函数是为了覆盖基类中的虚函数而声明的。使用override关键字可以帮助我们在编译时发现潜在的错误,提高代码质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值