C++类的继承概念辨析:虚函数,虚函数表,抽象基类,纯虚函数,虚基类,虚继承

本文详细介绍了C++中的虚函数、虚函数表、抽象基类和纯虚函数的概念及其作用。动态绑定是虚函数的基础,允许基类指针调用派生类的成员函数。虚函数表存储了对象类型和对应虚函数的调用地址,实现动态绑定。虚函数提供了一种统一接口,隐藏了具体实现。抽象类通过纯虚函数声明功能,但不提供实现,派生类必须实现纯虚函数。虚基类和虚继承用于解决交叉继承导致的重复基类对象问题,保证只有一个间接基类对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚函数和虚函数表

在了解什么是虚函数之前,首先要理解什么是动态绑定。

动态绑定
  • 动态绑定是C++类指针或引用的特性,当编译器遇到一个基类指针或引用时,并不直接确定其类型,而是在运行时根据其具体指向来调用对应的函数。
  • 为什么基类指针和引用可以指向派生类呢?因为类的继承关系是一种is a的关系,即派生类是特殊的基类,因此基类指针和引用可以指向派生类,但是此时的基类指针和引用,只能访问基类的对象和成员函数。如果想要在不发生强制类型转换的情况下访问派生类的成员函数,就要用到虚函数的概念。
虚函数应用示例
  • 虚函数的实现前提是,派生类和基类中存在同样的函数,名字和形参列表都一致,在基类中该函数有virtual关键字声明,派生类中无所谓。
  • 于是当程序执行遇到基类指针或者引用时,先判断指向的类型,再根据类型调用相关的函数。注意:只要是基类指针指向的虚函数调用,均会实行动态绑定,容易忽略的一点是在基类的成员函数内部发生的调用,隐含了this指针,所以同样会发生动态绑定。可以观察以下代码,猜测其输出,然后和运行结果进行对比。
#include <iostream>

using namespace std;
class base
{
   
   
public:
    virtual void display()
    {
   
   
        cout<<"I am  base display\n";
    }
    void display(int i)
    {
   
   
        cout<<"base i="<<i<<endl;
    }
    void show()
    {
   
   
        cout<<"this is base show"<<endl;
        display();
    }
};
class derived:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值