首页 > 编程语言 >C++中的虚函数与多态机制如何工作?

C++中的虚函数与多态机制如何工作?

时间:2024-07-25 23:26:59浏览次数:9  
标签:调用 函数 基类 多态 C++ 派生类 foo

在C++中,虚函数和多态机制是实现面向对象编程的重要概念。

虚函数是在基类中声明的函数,可以在派生类中进行重写。当基类的指针或引用指向派生类的对象时,通过调用虚函数可以实现动态绑定,即在运行时确定要调用的函数。

多态是指通过基类的指针或引用调用虚函数时,会根据对象的实际类型来确定要调用的函数,而不是根据指针或引用的类型。这种机制使得可以在不知道对象的具体类型的情况下,能够调用到正确的函数。

在C++中,实现虚函数和多态机制需要两个关键点:

  1. 基类中声明虚函数:在基类中使用关键字virtual来声明一个函数为虚函数。例如:
class Base {
public:
    virtual void foo() {
        // Virtual function
    }
};
  1. 派生类中重写虚函数:在派生类中重新定义虚函数,可以使用override关键字来确保该函数是在基类中声明的虚函数的重写。例如:
class Derived : public Base {
public:
    void foo() override {
        // Override virtual function
    }
};

当通过基类的指针或引用调用虚函数时,编译器会根据对象的实际类型来确定要调用的函数。如果派生类中对虚函数进行了重写,那么就会调用派生类中的函数,实现了多态。

以下是一个示例代码,演示了虚函数和多态的使用:

#include <iostream>

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

class Derived : public Base {
public:
    void foo() override {
        std::cout << "Derived::foo()" << std::endl;
    }
};

int main() {
    Base* ptr = new Derived();
    ptr->foo();  // Output: Derived::foo()
    delete ptr;
    return 0;
}

在上述代码中,基类Base中声明了一个虚函数foo(),派生类Derived中对该虚函数进行了重写。在main()函数中,创建了一个基类指针ptr指向派生类对象,通过该指针调用虚函数foo()时,会根据对象的实际类型调用派生类的函数,输出"Derived::foo()"。

标签:调用,函数,基类,多态,C++,派生类,foo
From: https://blog.csdn.net/xy520521/article/details/140702237

相关文章

  • Prometheus之数据类型和函数
    前言:在了解Prometheus数据类型前,我们先了解下面几个统计学名词概念:平均数(Mean):平均数是所有数据加起来除以数据个数得到的结果。它表示数据的中心趋势。最大值(Maximum):最大值是数据集中最大的数值。它表示数据的上限。最小值(Minimum):最小值是数据集中最小的数值。它表示......
  • Lua 语法之函数
    函数的定义--函数的定义function函数名()enda=function()end无参数无返回值函数functionF1() print("F1函数")end--Lua执行是自上往下执行函数不同于变量,--执行函数时必须先定义且在执行函数上面有定义F1()--有点类似C#中的委托和事件写法F2=fun......
  • C++文件系统操作5 - 跨平台列出指定目录下的所有文件和文件夹
    1.关键词2.fileutil.h3.fileutil.cpp4.filesystem_win.h5.filesystem_win.cpp6.filesystem_unix.cpp7.源码地址1.关键词C++文件系统操作列出指定目录下的所有文件列出指定目录下的所有文件夹跨平台2.fileutil.h#pragmaonce#include<string>#includ......
  • C# —— 析构函数
    构造函数创建对象对属性进行初始化的作用析构函数:当一个对象被释放的时候执行析构函数的特点:一个类只能有一个析构函数。无法继承或重载析构函数。无法调用析构函数。它们是被自动调用的。析构函数既没有修饰符,也没有参数。语法 ~方法名(){        语法;}......
  • 面向对象之抽象_接口_多态
    一.抽象1.抽象的介绍abstract​1.将多个类中共有的方法抽取到父类,发现方法体没法实现,所以将此方法定义成抽象方法​2.抽象方法所在的类一定是抽象类​3.抽象类publicabstractclass类名{}​4.抽象方法修饰符abstract返回值类型方法名(参数);​5.注意:......
  • C++ - 目录 - 一周速通
    基础入门免费教程希望可以帮助每一位编程爱好者!开源地址:点我加入开发工具随课习题文章目录C++基础-0-了解历史C++基础-1-开始入门C++基础-2-数据类型C++基础-3-变量常量C++基础-4-运算符号C++基础-5-条件判断C++基础-6......
  • 【C++】选择结构案例-三只小猪称体重
    案例问题假设有三只小猪A、B、C,在输入三者体重后希望能输出他们各自的体重并测出谁最重思路先让A与B相比较,如果A重,则让A和C相比较,如果A重则输出A最重,否则输出C最重在最开始的条件(AB相比较),如果B重,则让B与C相比较,如果B重则输出B最重,否则C最重下面是一个实例#include<iostre......
  • 【C++】选择结构- 嵌套if语句
    嵌套if语句的语法格式:if(条件1) {        if(条件1满足后判断是否满足此条件){条件2满足后执行的操作}        else{条件2不满足执行的操作}}下面是一个实例#include<iostream>usingnamespacestd;intmain4(){ /* 提示用户输入一个高考分数......
  • Python知识点—math函数,方法全解,细致易懂
    代码中已标明函数的方法以及操作importmathformathsindir(math):ifnotmaths.startswith("__"):#打印math函数的方法,不显示以"__"开头的print(maths)print(math.pi)#π值3.141592653589793#无穷大print(math.inf>99999999999999999999999......
  • C++ 列式内存布局数据存储格式 Arrow
    ApacheArrow优点:   高性能数据处理:Arrow使用列式内存布局,这特别适合于数据分析和查询操作,因为它允许对数据进行高效批量处理,减少CPU缓存未命中,从而提升处理速度。   零拷贝数据共享:Arrow允许不同系统和进程之间直接共享内存中的数据而无需复制,这对于提高数据......