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

目录
  • 一、虚函数
  • 二、虚函数与纯虚函数的区别
  • 三、动态多态

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

一、虚函数

首先来看下面这一段代码,首先创建两个类,一个是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++虚函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 多态虚函数的底层原理深入理解

    目录 1 多态的基本概念 1.1 什么是多态? 1.2 怎么实现多态 2 虚函数的底层原理 1 多态的基本概念 1.1 什么是多态? 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为,通常是父类调用子类的重写函数,在C++中就是 父类指针指向子类对象,此时父类指针的向下引用就可以实现多态 比如看下面的代码: class Animal { public: //虚函数 virtual void speak() { cout << "动物在说话" <<

  • C++的多态和虚函数你真的了解吗

    目录 一.C++的面试常考点 二.阿里真题 2.1 真题一 (1)虚函数表vtbl (2)构造一个派生类对象的过程 (3)析构一个派生类对象的过程 2.2 真题二 2.3 真题三 2.4 真题四 2.5 真题五 三.小结 总结 一.C++的面试常考点 阿里虽然是国内Java的第一大厂但是并非所有的业务都是由Java支撑,很多服务和中下层的存储,计算,网络服务,大规模的分布式任务都是由C++编写.在阿里所有部门当中对C++考察最深的可能就是阿里云. 阿里对C++的常考点: 1.STL 容器相关实现

  • c++虚函数与虚函数表原理

    目录 1.什么是虚函数? 2.虚函数会影响类的内存 3.了解虚函数表--->通过虚函数表的指针去访问数据 4.虚函数声明 1.什么是虚函数? 用virtual 修饰的成员函数叫虚函数 小知识: 没有虚构造函数        不写虚函数,没有默认的虚函数 普通函数不影响类的内存: class MM { public: void print() { cout << "普通函数"<< endl; //普通函数不影响类的内存<--->普通函数存在另一段

  • C++虚函数注意事项

    目录 一.虚函数注意事项 1.构造函数 2.析构函数 3.友元 4.没有重新定义 5.重新定义将隐藏方法 文章转自公众号:Coder梁(ID:Coder_LT) 一.虚函数注意事项 在之前的文章当中,我们已经讨论了虚函数的使用方法,也对它的原理进行了简单的介绍. 这里简单做一个总结: 在基类的方法声明中使用关键字virtual可以声明虚函数 加上了virtual关键字的函数在基类以及派生类和派生类再派生出来的类中都是虚的 在调用虚函数时,程序将会根据对象的类型执行对应的方法而非引用或指针的类型

  • C++的多态与虚函数你了解吗

    目录 多态性 虚函数 总结 多态性 多态性是面向对象程序设计的关键技术之一,若程序设计语言不支持多态性,不能称为面向对象的语言,利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能 在C++中有两种多态性: 编译时的多态 通过函数的重载和运算符的重载来实现的 运行时的多态性 运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定:它是通过类继承关系public和虚函数来实现的,目的也是建立一种通用的程序:通用性是

  • C++虚函数表与类的内存分布深入分析理解

    目录 不可定义为虚函数的函数 将析构函数定义为虚函数的作用 虚函数表原理 继承关系中虚函数表结构 多重继承的虚函数表 多态调用原理 对齐和补齐规则 为什么要有对齐和补齐 资源链接 不可定义为虚函数的函数 类的静态函数和构造函数不可以定义为虚函数: 静态函数的目的是通过类名+函数名访问类的static变量,或者通过对象调用staic函数实现对static成员变量的读写,要求内存中只有一份数据.而虚函数在子类中重写,并且通过多态机制实现动态调用,在内存中需要保存不同的重写版本. 构造函数的作用是构造

  • C++中纯虚函数的实例详解

    目录 虚函数和纯虚函数 附:纯虚函数的应用 总结 虚函数和纯虚函数 之前学过虚函数,语法:virtual 返回值类型 函数名(参数列表),然后这个类也就变成的虚基类,然后子类重写父类的虚函数. 纯虚函数,语法:virtual 返回值类型 函数名(参数列表)=0,当类中有了纯虚函数,这个类也称为抽象类.抽象类特点:无法实例化对象,子类必须重写抽象类中的纯虚函数,否则也属于抽象类. class Base { public: virtual void Examp() = 0;//纯虚函数 ~Base(

  • C++虚函数表的原理与使用解析

    目录 前言 1.虚函数表 2.一般继承(无虚函数覆盖) 3.一般继承(有虚函数覆盖) 4.多重继承(无虚函数覆盖) 5.多重继承(有虚函数覆盖) 6.安全性 6.1 通过父类型的指针访问子类自己的虚函数 6.2 访问non-public的虚函数 7.结束语 7.1 VC中查看虚函数表 7.2 例程 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛

  • 深入了解C++的多态与虚函数

    目录 1.多态的机制与虚函数的机制 1.1 多态的机制 1.2 虚函数的机制 1.3虚函数表的结构图 1.4 动态多态实现的三个前提件(很重要) 2.多态实例应用 3.多态的巨大问题与虚析构 3.1代码举例说明 3.2代码实现 4.纯虚函数与抽象类 4.1纯虚函数语法格式 4.2纯虚函数的定义 4.3抽象类的应用实例 1.多态的机制与虚函数的机制 1.1 多态的机制 1.当在类中使用virtual声明一个函数为虚函数时,在编译时,编译器会自动在基类中默默地安插一个虚函数表指针,同时的.rodat

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

    目录 一.虚函数 二.虚函数与纯虚函数的区别 三.动态多态 阐述虚函数作用和原理.纯虚函数和虚函数的区别. 一.虚函数 首先来看下面这一段代码,首先创建两个类,一个是Dog,另一个是Cat,他们有一个共同的属性:Run.在定义中每个动物都需要创建一个类,比较繁琐,所以在下面的例子中,我们可以把他们简化. #include <iostream> using namespace std; class Dog{ public: void Run(){ cout<<"Dog-&g

  • c#中虚函数的相关使用方法

    若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法. 虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的(以后再讲)虚方法的特点:虚方法前不允许有static,abstract,或override修饰符虚方法不能是私有的,因此不能使用private修饰符虚方法的执行:我们知道一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象

  • 简单解读C++中的虚函数

    虚函数 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码 class A{ public: void print(){ cout<<"This is A"<<endl;} }; class B:public A{ public: void print()

  • python实现得到一个给定类的虚函数

    本文实例讲述了python实现得到一个给定类的虚函数的方法,分享给大家供大家参考.具体如下: 现来看看如下代码: import wx for method in dir(wx.PyPanel): #这里改成给定的类 if method.startswith("base_"): print method 输出的结果为: base_AcceptsFocus base_AcceptsFocusFromKeyboard base_AddChild base_DoGetBestSize base

  • C++ 虚函数和纯虚函数的区别分析

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数. 简介 假设我们有下面的类层次: class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; cl

  • C++ 虚函数与纯虚函数的使用与区别

    目录 什么是虚函数: 虚函数的注意事项: 纯虚函数 纯虚函数的注意事项: 虚函数与纯虚函数区别 什么是虚函数: 虚函数 是在基类中使用关键字 virtual 声明的函数,在C++ 语言中虚函数可以继承,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动生成为虚函数, 虚函数主要体验C++的多态方面,(多态是参数个数和类型相同而实现功能不同的函数) 为了更好的里面虚函数请看下面的demo #include <iostream> #include <string> using

  • C++ 虚函数与纯虚函数代码详解

    目录 什么是虚函数: 虚函数的注意事项: 存虚函数 总结 什么是虚函数: 虚函数 是在基类中使用关键字 virtual 声明的函数,在C++ 语言中虚函数可以继承,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动生成为虚函数, 虚函数主要体验C++的多态方面,(多态是参数个数和类型相同而实现功能不同的函数) 为了更好的里面虚函数请看下面的demo #include <iostream> #include <string> using namespace std; cla

  • C/C++中虚函数详解及其作用介绍

    目录 概述 使用方法 关联 静态关联 动态关联 案例1 未使用虚函数 使用虚拟类 案例2 总结 概述 虚函数 (virtual function) 指可以被子类继承和覆盖的函数. 使用方法 基类声明成员函数为虚函数的方法: virtual [类型] 函数名([参数表列]) 注: 在类外定义虚函数时, 不需再加 virtual. 虚函数的特点: 提高程序扩充性: 派生类根据需要可以进行函数覆盖 成员函数被声明为虚数后, 其派生类中覆盖函数自动称为虚函数 若虚函数在派生类中未重新定义, 则派生类简单

  • C++中的多态与虚函数的内部实现方法

    1.什么是多态 多态性可以简单概括为"一个接口,多种行为". 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可以用自己的方式去响应共同的消息.所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数.这是一种泛型技术,即用相同的代码实现不同的动作.这体现了面向对象编程的优越性. 多态分为两种: (1)编译时多态:主要通过函数的重载和模板来实现. (2)运行时多态:主要通过虚函数来实现. 2.几个相关概念 (1)覆盖.

  • 浅析C++中的虚函数

    一.定义定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数. 语法:virtual 函数返回类型函数名(参数表) { 函数体 } 用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数 虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public. 定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数. 二.作用虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函

随机推荐