【运维经】第45章——marked override, but does not override

本文深入探讨了C++11中引入的override关键字,解释了如何使用它来确保派生类正确重载基类的虚拟函数。通过具体代码示例,展示了当派生类的函数未正确重载基类函数时,编译器将如何发出错误警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运维经–目录


marked override, but does not override

c++11中引入了override关键字,被override修饰的函数其派生类必须重载。

#include <iostream>

class Object
{
public:
    Object(){};
    virtual ~Object(){};

    virtual void fun() override
    {
        std::cout << "Object::fun" << std::endl;
    }
};

class Base:public Object
{
public:
    Base(){};
    virtual ~Base(){};

    void fun();
};
void Base::fun()
{
    std::cout << "Base::fun" << std::endl;
}

int main(){
    Object* b = new Base;
    b->fun();
    return 0;
}

编译:

[frank@LAPTOP-0OCJTGJR class]$ g++ -g -std=c++11 test_class.cpp

test_class.cpp:9:18: error: ‘virtual void Object::fun()’ marked override, but does not override
     virtual void fun() override
                  ^
### 解决'C++ 中标记为 `override` 但未覆盖的问题' 当编译器报告某个成员函数被标记为 `override` 却未能成功重写基类中的虚函数时,通常意味着存在以下几种情况之一: #### 函数签名不匹配 即使子类方法看起来像是要重载父类的方法,但如果参数列表或返回类型不同,则不会发生真正的重载。这可能是由于额外的空格、不同的常量修饰符或其他细微差异造成的。 ```cpp class Base { public: virtual void show() const {} // 基类中定义了一个带const限定词的方法 }; class Derived : public Base { public: void show() override {}; // 子类试图重写该方法但是忘记加上const关键字 }; ``` 上述例子中,`Derived::show()` 和 `Base::show()` 的区别在于后者有一个 `const` 关键字,因此它们实际上是两个独立的方法而不是重写的版本[^1]。 #### 虚拟机制失效 如果基类里的目标函数不是虚拟的 (`virtual`) 或者根本没有声明成可以被继承链上的其他类所改写的形式,那么即便使用了 `override` 标记也不会有任何效果。 ```cpp class Parent { public: void func(); // 非虚函数无法通过派生类来改变行为 }; class Child : public Parent { public: void func() override; // 这里会报错因为Parent::func并不是一个可覆写的接口 }; ``` 为了修正这个问题,在基类中应该把打算让后代修改的行为设置为 `virtual` 类型: ```cpp class CorrectParent { public: virtual void correctFunc(); }; class CorrectChild : public CorrectParent { public: void correctFunc() override; }; ``` #### 编译期错误提示 现代 C++ 编译工具会在检测到此类问题时给出详细的诊断信息帮助开发者定位并解决问题。对于那些确实意图去实现特定抽象操作却又意外失败的情形来说非常有用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏 克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值