c++的virtual和override作用及说明

 更新时间:2022年11月05日 09:18:42   作者:游戏猫  
这篇文章主要介绍了c++的virtual和override作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、概述

c++的virtual提供了运行时的多态,可以用基类的指针调用子类对象的函数,通过override可以强制要求基类有对应的虚函数。

二、测试代码

#pragma once
#include <stdio.h>
class Base
{
public:
    void A_1() 
    {
        printf("Base::A_1\n");
    };
    virtual void A_2() 
    {
        printf("Base::A_2\n");
    }
    virtual void A_3() 
    {
        printf("Base::A_3\n");
    }

    virtual void A_4()
    {
        printf("Base::A_4\n");
    }

    void A_5() 
    {
        printf("Base::A_5\n");
    }
};

class Drived : public Base
{
public:
    void A_1() //覆盖了基类的函数,用基类指针调用时调用到的时基类的A_1,用子类指针调用时调用到的时子类的A_1
    {
        printf("Drived::A_1\n");
    };
    virtual void A_2() //用基类或子类指针都调用到的是子类的A_2,之类的virtual说明的是是子类的A_2还可以被virtual
    {
        printf("Drived::A_2\n");
    }
    void A_3() //用基类或子类指针都调用到的是子类的A_2
    {
        printf("Drived::A_3\n");
    }

    virtual void A_4() override //子类加上override,如果基类没有对应virtual函数就会编译错误。避免拼错和记错没有重写基类函数
    {
        printf("Drived::A_4\n");
    }
    /*
    void A_5() override //编译错误 'Drived::A_5': method with override specifier 'override' did not override any base class methods    
    { 
        printf("Drived::A_5\n");
    }
    */
};

class Drived2 : public Drived
{
public:
    void A_2() override 
    {
        printf("Drived2::A_2\n");
    }
    void A_3()  override//用基类或子类指针都调用到的是子类的A_2
    {
        printf("Drived2::A_3\n");
    }
};

class VirtualTest
{
public:
    void DoTest()
    {
        Drived *drived = new Drived();
        Base *base = drived;
        base->A_1();
        drived->A_1();
        printf("\n");

        base->A_2();
        drived->A_2();
        printf("\n");

        base->A_3();
        drived->A_3();
        printf("\n");

        base->A_4();
        drived->A_4();
        printf("\n");

        Drived2 *drived2 = new Drived2();
        base = drived2;
        drived = drived2;
        
        base->A_2();
        drived->A_2();
        drived2->A_2();
        printf("\n");

        base->A_3();
        drived->A_3();
        drived2->A_3();

    }
};

三、输出

Base::A_1
Drived::A_1

Drived::A_2
Drived::A_2

Drived::A_3
Drived::A_3

Drived::A_4
Drived::A_4

Drived2::A_2
Drived2::A_2
Drived2::A_2

Drived2::A_3
Drived2::A_3
Drived2::A_3

四、总结

1、基类函数没加virtual,子类有相同函数,实现的是覆盖。用基类指针调用时,调用到的是基类的函数;用子类指针调用时,调用到的是子类的函数。

2、基类函数加了virtual时,实现的时重写。用基类指针或子类指针调用时,调用到的都是子类的函数。

3、函数加上override,强制要求基本相同函数需要是虚函数,否则会编译报错。

4、子类的virtual可加可不加,建议加override不加virtual。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 简单分析C语言中指针数组与数组指针的区别

    简单分析C语言中指针数组与数组指针的区别

    这篇文章主要介绍了C语言中指针数组与数组指针的区别,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • C语言如何用顺序栈实现回文序列判断

    C语言如何用顺序栈实现回文序列判断

    这篇文章主要为大家介绍了C语言如何用顺序栈来实现回文序列的判断,文中含有详细的代码示例及分析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • QT TCP实现简单的通信示例

    QT TCP实现简单的通信示例

    这篇文章主要为大家详细介绍了QT TCP简单的通信示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++学习之IO流(输入输出流)详解

    C++学习之IO流(输入输出流)详解

    流是一种抽象概念,它代表了数据的无结构化传递。而用来进行输入输出操作的流就称为IO流。这篇文章主要为大家介绍了C++中IO流的使用详解,需要的朋友可以参考一下
    2021-12-12
  • C语言malloc与calloc区别详解

    C语言malloc与calloc区别详解

    本文主要介绍了C语言malloc与calloc区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 基于atoi()与itoa()函数的内部实现方法详解

    基于atoi()与itoa()函数的内部实现方法详解

    本篇文章是对atoi()与itoa()函数的内部实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言中的递归,你真的懂了吗?

    C语言中的递归,你真的懂了吗?

    这篇文章主要给大家介绍了关于C语言中递归的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C++可变参数函数的实现方法示例

    C++可变参数函数的实现方法示例

    这篇文章主要给大家介绍了关于C++可变参数函数的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C++中指针函数与函数指针的使用

    C++中指针函数与函数指针的使用

    今天小编就为大家分享一篇关于C++中指针函数与函数指针的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解C语言之顺序表

    详解C语言之顺序表

    这篇文章主要为大家介绍了C语言的顺序表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11

最新评论