返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++浅析虚函数使用方法
  • 255
分享到

C++浅析虚函数使用方法

2024-04-02 19:04:59 255人浏览 薄情痞子
摘要

目录一、虚函数二、虚函数与纯虚函数的区别三、动态多态阐述虚函数作用和原理、纯虚函数和虚函数的区别。 一、虚函数 首先来看下面这一段代码,首先创建两个类,一个是Dog,另一个是Cat,

阐述虚函数作用和原理、纯虚函数和虚函数的区别。

一、虚函数

首先来看下面这一段代码,首先创建两个类,一个是Dog,另一个是Cat,他们有一个共同的属性:Run。在定义中每个动物都需要创建一个类,比较繁琐,所以在下面的例子中,我们可以把他们简化。

#include <iOStream>
using namespace std;
class Dog{
public:
    void Run(){
        cout<<"Dog->Run"<<endl;
    }    
};
class Cat{
public:
    void Run(){
        cout<<"Cat->Run"<<endl;
    }
};
int main()
{
    Dog d;
    d.Run();
    Cat c;
    c.Run();
    return 0;
}

这里使用多态和虚函数,而Animal提供统一的接口,供子类使用,虽然代码繁琐,但提高了整个工程的可扩展性和灵活性。

在普通函数前加上关键字 virtual 构成虚函数,子类需要重写父类的虚函数,这样在调用的时候,会覆盖掉父类的虚函数 Run,去执行子类的Run。

#include <iostream>
using namespace std;
class Animal{
public:
    virtual void Run(){
        cout<<"Animal->Run"<<endl;
    }
};
class Dog :public Animal{
public:
    void Run(){
        cout<<"Dog->Run"<<endl;
    }    
};
class Cat:public Animal{
public:
    void Run(){
        cout<<"Cat->Run"<<endl;
    }
};
int main()
{
    Animal *ani;
    ani = new Dog;
    ani->Run();
    delete ani;
    ani = new Cat;
    ani->Run();
    delete ani;
    return 0;
}

结果如下:

所以在这里只需要修改ani的指向就可以实现不同方法。如果不存在虚函数,把Animal类的关键词virtual去掉会怎么样呢,显然,他们会默认实现父类Run的方法。

class Animal{
public:
    void Run(){
        cout<<"Animal->Run"<<endl;
    }
};

所以引入虚函数是为了实现动态多态,指向不同的子类来实现不同的方法。

二、虚函数与纯虚函数的区别

因为父类的函数可以不做任何操作,所以这里可以直接等于0;实现纯虚函数。

//虚函数
class Animal{
public:
    virtual void Run(){
        cout<<"Animal->Run"<<endl;
    }
};
//纯虚函数
class Animal{
public:
    virtual void Run()=0;
};

虚函数与纯虚函数的区别:

纯虚函数只是一个接口,只能供子类去重写实现方法。而虚函数在里面也可以去实现父类的功能。只需要指向父类的方法即可。

总结:虚函数在子类里面也可以不进行重写,但纯虚函数必须在子类去实现,如果把子类中的Run方法去掉,只留下父类中的纯虚函数,那么编译器会报错,这里大家可以试试。

三、动态多态

Animal内部的结构是什么样呢?这里有一个虚函数指针(vfptr)和虚函数表(vftable)。 指针(vfptr)指向虚函数表,在虚函数表(vftable)内记录着虚函数的地址,即Run函数的地址。

当子类的Dog去继承父类后,父类的虚函数表相应的也继承下来,子类也会保存一份和父类相同的。

注意!这时候如果发生重写,即子类重写了父类的虚函数,则子类的虚函数表会覆盖父类继承下来的虚函数表。但父类的虚函数表不会发生改变。

当父类的指针或者引用指向子类的对象时,就发生了多态。

下面的代码中是指向了Dog,所以会去Dog的虚函数表中找到相应的函数,在运行阶段发生了动态多态。

    Animal *ani;
    ani = new Dog;
    ani->Run();

到此这篇关于c++浅析虚函数使用方法的文章就介绍到这了,更多相关C++虚函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++浅析虚函数使用方法

本文链接: https://lsjlt.com/news/165921.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++浅析虚函数使用方法
    目录一、虚函数二、虚函数与纯虚函数的区别三、动态多态阐述虚函数作用和原理、纯虚函数和虚函数的区别。 一、虚函数 首先来看下面这一段代码,首先创建两个类,一个是Dog,另一个是Cat,...
    99+
    2024-04-02
  • C++浅析内联函数的使用
    目录一. 概念二. 特性一. 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。 在C++里...
    99+
    2024-04-02
  • C语言浅析函数的用法
    目录问题引入函数C语言中函数的语法形式问题例子函数的调用过程函数声明变量声明数组声明问题引入 有时候,我们经常需要在一个程序中,对一个数组进行 键盘输入,打印数组元素值。 有些代码块...
    99+
    2024-04-02
  • C++中如何使用虚析构函数
    C++中如何使用虚析构函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C++的多态性是通过虚函数来实现的,虚函数的出现使得动态链接成为可能。基于构造函数的特点...
    99+
    2023-06-17
  • 浅析C# treeview控件的使用方法
    C#中的treeview控件是用来显示层次结构数据的控件。它通常用于显示树形数据结构,比如文件目录结构、组织结构等。使用treevi...
    99+
    2023-09-22
    C#
  • C++浅析析构函数的特征
    目录定义特征编译器生成的默认析构函数定义 析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资...
    99+
    2024-04-02
  • C++虚函数表的原理与使用解析
    目录前言1.虚函数表2.一般继承(无虚函数覆盖)3.一般继承(有虚函数覆盖)4.多重继承(无虚函数覆盖)5.多重继承(有虚函数覆盖)6.安全性6.1 通过父类型的指针访问子类自己的虚...
    99+
    2024-04-02
  • Python yield 使用方法浅析
    如何生成斐波那契盗/strong> 斐波那契(Fibonacci)盗惺且桓龇浅<虻サ牡莨槭校谝桓龊偷诙鍪猓我庖桓鍪伎捎汕傲礁鍪嗉拥玫健S眉扑慊绦蚴涑鲮巢瞧盗械那 N 个数是一个非常简单的问题,许多初学者都...
    99+
    2022-06-04
    使用方法 Python yield
  • React浅析Fragments使用方法
    目录概述动机短语法带key 的Fragments概述 可以将子列表分组,而无需向DOM添加额外节点简单理解:空标签<React.Fragment></React.F...
    99+
    2022-12-03
    React Fragments的使用 React Fragments
  • C++ 虚函数与纯虚函数的使用与区别
    目录什么是虚函数:虚函数的注意事项:纯虚函数纯虚函数的注意事项:虚函数与纯虚函数区别什么是虚函数: 虚函数 是在基类中使用关键字 virtual 声明的函数,在C++ 语言中虚函数...
    99+
    2024-04-02
  • C++中如何使用虚函数
    C++中如何使用虚函数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。何为虚函数?C++虚函数就是被关键字virtaul说明的函数。举个例子:这个例子中WindowB和Win...
    99+
    2023-06-17
  • C++浅析缺省参数的使用
    目录一. 概念二. 分类全缺省参数半缺省参数一. 概念 缺省参数(有些地方叫默认参数)是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否...
    99+
    2024-04-02
  • 浅析C++中的间接宏函数
    宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义、使用宏函数。 但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕, #defi...
    99+
    2024-04-02
  • C++浅析构造函数的特性
    目录构造函数的概念构造函数的特性只能有一个构造函数构造函数的概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值...
    99+
    2024-04-02
  • C++虚函数表和虚析构介绍
    目录1、虚函数表2、虚析构1、虚函数表 虚函数表是C++实现多态的基础,多态是面向对象的三大特性之一,多态有利于提高代码的可读性,便于后期代码的扩展和维护。我们都知道多态的实现是基于...
    99+
    2024-04-02
  • github怎么使用?方法浅析
    GitHub是一款基于Git的版本控制工具,它能够将代码托管到云端,并提供了一系列协作工具,帮助开发者更高效地管理和维护自己的代码。以下是GitHub的使用方法:一、 创建账户首先,用户需要在GitHub官网创建自己的账户。在创建账户的过程...
    99+
    2023-10-22
  • C# AttributeUsage的使用浅析
    AttributeUsage是一个用于指定自定义属性的使用规范的特性类。通过使用AttributeUsage特性,可以限制自定义属性...
    99+
    2023-09-12
    C#
  • 浅析React Hook中useEffecfa函数的使用
    我们知道在类组件中是可以有生命周期函数的, 那么如何在函数组件中定义类似于生命周期这些函数呢Effect Hook 可以让你来完成一些类似于class中生命周期的功能;事实上,类似于网络请求、手动更新DOM、一些事件的监听,都是React更...
    99+
    2022-11-22
    React Hook React
  • Python浅析匿名函数lambda的用法
    目录lambda函数的定义   Lambda函数在Python中lambda函数的定义    lambda函数是Pytho...
    99+
    2024-04-02
  • C++ 虚函数表图文解析
    一、前言 一直以来,对虚函数的理解仅仅是,在父类中定义虚函数,子类中可以重写该虚函数,并且父类指针可以指向子类对象,调用子类的虚函数(多态)。在读研阶段经历的几个项目中,自己所写的类...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作