文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中的显式虚函数重载:override与final详解

2024-11-30 00:08

关注

二、虚函数与多态性

在C++中,虚函数(virtual function)允许子类重写父类中的函数,从而实现多态性。多态性意味着可以使用父类指针或引用来调用子类对象中重写的函数。这是通过动态绑定(dynamic binding)实现的,即在运行时确定调用哪个类的函数。

class Base {
public:
    virtual void func() { // 虚函数
        std::cout << "Base::func()" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() override { // 重载虚函数
        std::cout << "Derived::func()" << std::endl;
    }
};

在这个例子中,Base类定义了一个虚函数func(),而Derived类重写了这个函数。当我们通过Base类的指针或引用来调用func()时,将调用相应对象实际类型的func()函数,这就是多态性的体现。

三、override关键字

在C++11之前,如果子类想要重载父类的虚函数,编译器并不会提供太多的帮助来确保重载的正确性。有时可能因为参数列表或返回类型的微小差异而导致重载失败,但编译器可能并不会给出明确的错误信息。

C++11引入了override关键字,它显式地告诉编译器:这个函数是重载父类的虚函数。如果该函数没有正确重载父类的虚函数(例如参数列表或返回类型不匹配),编译器将给出错误信息。这大大提高了代码的可读性和健壮性。

class Derived : public Base {
public:
    void func() override { // 使用override关键字
        std::cout << "Derived::func()" << std::endl;
    }
};

在这个例子中,如果Derived::func()的签名与Base::func()不匹配,或者Base::func()不是虚函数,编译器将给出错误提示。

四、final关键字

final关键字在C++中有两种用法:一是修饰类,表示该类不能被继承;二是修饰虚函数,表示该函数不能被重写。

1.修饰类:当一个类被声明为final时,它不能被其他类继承。这有助于确保类的设计不被意外破坏或误用。

class MyFinalClass final { // 使用final关键字修饰类
    // ...
};

// 下面的代码将导致编译错误,因为MyFinalClass不能被继承
// class DerivedFromFinal : public MyFinalClass { };

2.修饰虚函数:当一个虚函数被声明为final时,它不能在派生类中被重写。这有助于确保某个特定的实现不被修改。

class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() final { // 使用final关键字修饰虚函数
        std::cout << "Derived::func()" << std::endl;
    }
};

// 下面的代码将导致编译错误,因为Derived::func()已经被声明为final,不能被重写
// class Derived2 : public Derived {
// public:
//     void func() override { } // 尝试重写final函数,将导致编译错误
// };

五、结论

C++11引入的override和final关键字为虚函数的重载和类的继承提供了更强大的控制。override确保了我们正确地重写了父类的虚函数,而final则防止了不必要的继承和重写。这两个关键字不仅提高了代码的可读性和可维护性,还增强了程序的健壮性。在实际编程中,合理使用这些关键字可以使我们的代码更加清晰、准确和高效。

来源:鲨鱼编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯