为什么C++不提供override这个关键字呀?

本文通过一个具体的示例探讨了C++中虚函数在加上默认参数后与子类覆盖函数间的关系变化,以及由此带来的潜在问题。作者指出,C++缺乏如Delphi或C#中的override关键字,在父类虚函数签名改变时无法得到编译器警告,从而增加了调试难度。
class Parent {
public:
    virtual void foo(int i=0) {
        cout << "Parent::foo() " << i << endl;
    }
};

class Son : public Parent {
public:
    virtual void foo() {
        cout << "Son::foo()" << endl;
    }
};
C++里关于虚函数声明的语法,一直很让我很不舒服,一再提醒自己小心小心,结果今天还是出了问题。看左边的示例,最早在Parent类中的foo这个虚函数,是没有参数的,所以一切都工作得很好,昨天因为需要,就把Parent类的foo函数加上一个默认参数,这个时候,其实Son类中声明的foo函数已经与父类毫无关系了,两个函数各是各的,但编译器没有任何警告……
这个时候,就看出delphi和c#里override关键字的好处来了,有了这个关键字,一旦父类修改了虚函数,编译器立马可以给出警告来,总之,编译器应该能够防止程序员犯错误,尽最大可能地将这一切严谨化。
唉,看来用C++,一辈子也别指望会引入override关键字了。
C++中`final`关键字和`override`关键字在功能和使用场景上存在明显区别: ### 功能用途 - **`final`关键字**:用于防止继承和重写操作。它既可以修饰类,使该类能被继承;也可以修饰成员函数,使该虚函数能被派生类重写 [^2][^3]。 ```cpp // 用于类 class FinalClass final { // 成员定义 }; // 错误:FinalClass被声明为final,能被继承 class DerivedFromFinal : public FinalClass {}; // 用于成员函数 class Base { public: virtual void foo() const final { // 实现 } }; class Derived : public Base { // 错误:能重写基类中标记为final的函数 // void foo() const override {} }; ``` - **`override`关键字**:用于修饰派生类中的成员函数,表示该函数重写了基类中的虚函数。它只在编译期起作用,通过检查函数签名来确保正确的覆盖关系,避免因函数签名匹配而引发的错误 [^1]。 ```cpp class Parent { public: virtual void eat() { std::cout << "Parent is eating." << std::endl; } }; class Child : public Parent { public: // 使用 override 关键字重写基类的虚函数 void eat() override { std::cout << "Child is eating." << std::endl; } }; ``` ### 修饰对象 - **`final`关键字**:可以修饰类和虚函数 [^2][^3]。 - **`override`关键字**:只能修饰派生类中的成员函数,且该函数必须重写基类的虚函数 [^1]。 ### 编译检查作用 - **`final`关键字**:当尝试继承被`final`修饰的类或重写被`final`修饰的虚函数时,编译器会报错,阻止符合规则的操作 [^2][^3]。 - **`override`关键字**:如果派生类中使用`override`修饰的函数没有正确重写基类的虚函数编译器会报错,确保函数重写的正确性 [^1]。 ### 对代码影响 - **`final`关键字**:主要用于限制类的继承和函数的重写,增强代码的安全性和稳定性,避免必要的派生和重写 [^2][^3]。 - **`override`关键字**:主要用于提高代码的可读性和可维护性,明确表示该函数是对基类虚函数的重写 [^1]。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值