登录/注册

虚函数

更多
在C++中,虚函数(Virtual Function)是用于实现多态(Polymorphism)的重要机制。它允许在基类中声明一个函数为虚函数,然后在派生类中重写(Override)该函数。这样,通过基类的指针或引用调用该函数时,程序会根据对象的实际类型来调用相应的函数实现。 ### 关键点: 1. **声明方式**:在基类中使用`virtual`关键字声明函数。 2. **重写**:在派生类中重写虚函数时,通常使用`override`关键字(C++11起)来显式指明,这有助于避免错误(如函数签名不一致)。 3. **动态绑定**:虚函数通过虚函数表(vtable)实现动态绑定(运行时多态),即程序在运行时根据对象的实际类型决定调用哪个函数。 4. **纯虚函数**:如果基类中的虚函数后面加上`=0`,则成为纯虚函数(Pure Virtual Function)。包含纯虚函数的类称为抽象类(Abstract Class),不能实例化。派生类必须实现所有的纯虚函数才能成为具体类。 ### 示例代码: ```cpp #include using namespace std; // 基类 class Base { public: // 虚函数 virtual void show() { cout << "Base show" << endl; } // 纯虚函数,使Base成为抽象类 virtual void pureVirtual() = 0; }; // 派生类 class Derived : public Base { public: // 重写基类的虚函数 void show() override { cout << "Derived show" << endl; } // 实现纯虚函数 void pureVirtual() override { cout << "Derived pureVirtual" << endl; } }; int main() { // Base b; // 错误,Base是抽象类 Derived d; Base* ptr = &d; ptr->show(); // 输出:Derived show ptr->pureVirtual(); // 输出:Derived pureVirtual return 0; } ``` ### 注意事项: - 构造函数不能是虚函数。 - 析构函数通常应该是虚函数(尤其是当类被设计为基类时),以确保正确调用派生类的析构函数。 - 虚函数会带来一些运行时开销(如虚表指针和虚表查找),但在需要多态时这是必要的。 ### 虚函数表(vtable): 每个包含虚函数的类都有一个虚函数表,其中存放了指向虚函数的指针。每个对象有一个指向该表的指针(vptr)。当调用虚函数时,程序通过vptr找到vtable,再通过vtable找到函数的实际地址。 总结:虚函数是实现运行时多态的关键,它允许通过基类指针或引用来调用派生类的函数实现,提高了代码的灵活性和可扩展性。

在 C++ 中,虚函数(Virtual Function) 是一种实现 运行时多态(Runtime Polymorphism) 的关键机制,它允许通过基类指针或引用调用派生类的重写函数。

核心概念:

  1. 声明方式
    在基类中使用 virtual 关键字声明函数:

    class Base {
    public:
       virtual void func() { // 虚函数
           std::cout << "Base function\n";
       }
    };
  2. 重写(Override)
    派生类可重写虚函数(无需重复 virtual,但建议使用 override 关键字明确意图):

    class Derived : public Base {
    public:
       void func() override { // 重写基类虚函数
           std::cout << "Derived function\n";
       }
    };
  3. 动态绑定
    通过基类指针/引用调用虚函数时,实际执行对象的真实类型的函数:

    Base* obj = new Derived();
    obj->func(); // 输出 "Derived function"(而非基类版本)

关键特性:


纯虚函数与抽象类


示例代码

#include <iostream>

// 基类
class Animal {
public:
    virtual void speak() { // 虚函数
        std::cout << "Animal sound\n";
    }
    virtual ~Animal() = default; // 虚析构函数
};

// 派生类
class Dog : public Animal {
public:
    void speak() override { // 重写虚函数
        std::cout << "Woof!\n";
    }
};

int main() {
    Animal* animal = new Dog();
    animal->speak();  // 输出 "Woof!"(动态多态)
    delete animal;    // 正确调用 Dog 的析构函数(因虚析构)
    return 0;
}

重要规则

  1. 虚函数必须是成员函数,不能是全局函数。
  2. 构造函数不能是虚函数,析构函数可以是(且常应为)虚函数。
  3. override 关键字(C++11起)显式标记重写,增强代码可读性并避免错误。
  4. 虚函数通过指针/引用调用时才触发多态,直接通过对象调用不生效。

虚函数是 C++ 面向对象设计的核心机制之一,用于实现 "同一接口,不同行为" 的多态特性,极大提升了代码的灵活性和可扩展性。

什么是运放的短和

在设计运放电路的时候我们经常会接触到两个词,虚短和虚断,今天就来和大家分享下什么是运放的虛短和虚断。我们设运放的同相端电压为up,电流为ip,反

2025-05-16 19:33:11

什么是C++函数? 应该怎么定义? 用途是什么?

什么是C++虚函数? 应该怎么定义? 主要用途是什么?

2023-11-08 06:58:27

什么情况下不能用短和断?集成运放断的条件

什么情况下不能用虚短和虚断?集成运放虚短虚断的条件 

2023-09-20 16:29:36

基于布尔函数导数的布尔置换构造

布尔函数导数的性质在密码构造中起着重要的作用。文中利用布尔函数导数的性质,构造了一个新的平衡布尔函数然后基于平衡布尔

资料下载 佚名 2021-06-17 10:58:14

基于双序列函数的web服务端防御方案

针对web应用服务端易受重放攻击的问题,提出一种基于双序列函数的Web服务端防御方案。分别利用序列函数和周期函数生成身份校验阶段和会话阶段的加密

资料下载 佚名 2021-03-22 15:17:06

如何使用FPGA实现激光雷达恒警率控制技术研究说明

研究了激光雷达中的雪崩光电二极管恒虚警率控制技术,提出了一种基于FPGA的恒虚警率控制电路,通过噪声检测能够有效地根据背景辐射进行自适应调整,保持恒定的虚

资料下载 佚名 2021-03-11 16:07:00

python的常用函数有哪些

map() 是 Python 内置的高阶函数,它接收一个函数 f 和一个list ,并通过把函数 f 依次作用在list 的每个元素上,得到一个

资料下载 佚名 2021-02-25 11:52:10

TCP面向连接的电路是怎么实现的

电子发烧友网站提供《TCP面向连接的虚电路是怎么实现的.pdf》资料免费下载

资料下载 李静 2020-11-26 17:31:00

深度解析C++中的函数

虚函数作为C++的重要特性,让人又爱又怕,爱它功能强大,但又怕驾驭不好,让它反咬一口,今天我们用CPU的角度,撕掉语法的伪装,重新认识一下虚

2023-02-15 11:14:10

C++函数操作指南(含代码示例)

本期博客,我们来介绍C++中的虚函数,并给出一些实际操作的建议。

2023-02-12 10:12:26

函数,C++开发者如何有效利用

虚函数是基类中声明的成员函数,且使用者期望在派生类中将其重新定义。那么,在 C++ 中,什么是

2023-02-11 09:39:26

滤波器设计中的椭圆函数

基本初等函数 是单周期的,具有虚周期 ,并且这个虚周期由双曲函数

2022-12-09 09:36:46

C++函数virtual详解

C++ 中的虚函数用于解决动态多态问题,虚函数的作用是允许在派生类中重新

2022-09-07 11:27:17

一文详解函数及其相关知识点

本期是C++基础语法分享的第七节,今天给大家来分享一下: (1)虚析构函数; (2)纯虚

2021-10-13 10:14:06

在C++中如何用函数实现多态

01 — C++虚函数探索 C++是一门面向对象语言,在C++里运行时多态是由虚函数

2021-09-29 14:18:49

7天热门专题 换一换
相关标签