C++ 中 virtual 的作用

文章目录

  • [1. 用于虚继承](#1. 用于虚继承)
  • [2. 用于抽象基类](#2. 用于抽象基类)
  • [3. 用于多态](#3. 用于多态)

C++ 的 virtual 关键字,常见有 3 种用途:虚继承、抽象基类和多态。

1. 用于虚继承

virtual 用于虚继承时,主要是为了解决菱形继承中的重复继承同名成员问题。使用形式如下

cpp 复制代码
class Derived: virtual public Base {
  ...
}

2. 用于抽象基类

用于创建抽象基类 abstract base class ,使用纯虚函数,形式如下:

cpp 复制代码
class Foo {
  public:
    virtual void func() = 0;
}

3. 用于多态

用于多态时,基类的接口函数和析构函数都应该加上 virtual 关键字,并用基类指针或引用指向派生类对象。

  1. 接口函数加上 virtual ,则当调用接口函数时,可以调用子类的同名函数,实现多态。

    现代 C++ 11 之后的代码,子类中重写基类的同名接口函数时,应该使用 override 或 final 关键字 。

  2. 建议给基类析构函数始终加上 virtual ,目的是进行主动防御型编程。

    具体来说:在多态中,如果基类析构函数不使用 virtual,并且使用了基类指针指向派生类对象,那么在删除派生类对象时,将无法调用派生类的析构函数,可能导致内存泄漏。

    因为无法控制后续使用者不使用基类指针指向派生类对象,因此最安全的做法是进行主动防御型编程,直接给基类的析构函数加上 virtual。


------------------------------ 本文结束 ------------------------------

相关推荐
励志不掉头发的内向程序员43 分钟前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
蒸蒸yyyyzwd8 小时前
秋招学习笔记 day46
c++·八股
码匠许师傅11 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
无名猿12 小时前
new/delete 与 malloc/free:为什么绝对不能混用
c++·内存管理·现代c++·踩坑记录
2601_9622186113 小时前
C++中decltype关键字的实现
开发语言·c++
繁华的地方不一定留下你的脚印14 小时前
C++ std::variant 与 std::visit:安全保存多种类型,写清每个处理分支
开发语言·c++
程序员老陆14 小时前
WIN32_LEAN_AND_MEAN:Windows 头文件里的“精简编译开关”
c++·windows
hold?fish:palm15 小时前
45 二叉树的右视图
开发语言·c++·算法
ShineWinsu16 小时前
对于Redis:Redis的认识以及分布式系统的解析
linux·数据库·c++·redis·缓存·消息队列·分布式架构
布莱克60516 小时前
在C++中,构造函数能不能是虚函数?析构函数为什么要虚?
开发语言·c++·构造函数·析构函数·虚函数