【C/C++】虚函数与纯虚函数

本篇讲述虚函数与纯虚函数的区别与用法

对于抽象类来说,它无法实例化对象,而对于抽象类的子类来说,只有把抽象类中的纯虚函数全部实现之后,那么这个子类才可以实例化对象

class person
{
private:
    int age;
    bool gender;
public:
    void work();
    void printInfo(); 
};

简单理解就是父类定义了一个群体将会有的动作以及行为:如Worker类,我们仅知道工人们会工作,但是我们不知道具体是什么工人以及从事于什么样的工作,因此,可以把worker类定义为抽象类,用以规定可能会有的行为以及操作。

class workerpublic person
{
private:
    int age;
    bool gender;
public:
    //定义为抽象基类是避免实例化造成的编译报错,并且基类的定义时1为了规定大致的行为操作,具体的内容实现是基于继承类
    virtual void work() = 0;
    virtual void printInfo() = 0; 
};

同时,对于抽象类的子类也可以是抽象类

class dustManpublic worker
{
private:
    int age;
    bool gender;
public:
    //定义为抽象基类是避免实例化造成的编译报错,并且基类的定义时1为了规定大致的行为操作,具体的内容实现是基于继承类
    virtual void work(){cout << "扫地";}
    virtual void printInfo(){cout << "我是清洁工";} 
};

需要注意的是,如果基类中有纯虚函数(该类为抽象类,不能实例化对象),那么子类实现过程中必须重新定义纯虚函数,编译器才不会报错。

  1. 虚函数是动态绑定的,也就是说。使用虚函数的指针和引用能够正确找到实际类的相应函数,而不是运行定义类的函数。

    这是虚函数的基本功能,就不再解释了。

  2. 构造函数不能是虚函数。并且,在构造函数中调用虚函数,实际运行的是父类的相应函数。由于自己还没有构造好, 多态是被disable的。

  3. 析构函数能够是虚函数。并且,在一个复杂类结构中。这往往是必须的

  4. 将一个函数定义为纯虚函数。实际上是将这个类定义为抽象类,不能实例化对象

  5. 纯虚函数通常未定义体,但也全然能够拥有, 甚至能够显示调用。

  6. 析构函数能够是纯虚的,但纯虚析构函数必须有定义体,*由于析构函数的调用是在子类中隐含的*

  7. 非纯的虚函数必须有定义体,不然是一个错误。

  8. 派生类的override虚函数定义必须和父类全然一致(c++11中使用override进行编译器检查)。除了一个特例,假设父类中返回值是一个指针或引用。子类override时能够返回这个指针(或引用)的派生。

    比如,在上面的样例中,在Base中定义了 virtual Base* clone(); 在Derived中能够定义为 virtual Derived* clone()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C的虚函数是通过在基类中声明一个虚函数,然后在派生类中对其进行重写来实现的。虚函数的引入对于C大型项目的接口设计和统一标准起到了常重要的作用。虚函数的另一个重要特性是多态性,它可以实现动态联编,即在运行时确定函数的调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++虚函数纯虚函数](https://blog.csdn.net/wx_14678/article/details/103844354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [38.【C++ 虚函数 纯虚函数 虚基类 (最全详解)】](https://blog.csdn.net/qq_69683957/article/details/126397761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C++纯虚函数浅谈](https://blog.csdn.net/duwenchao_Tom/article/details/76647380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

欧恩意

如有帮助,感谢打赏!

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

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

打赏作者

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

抵扣说明:

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

余额充值