c++面向对象高级编程 学习十六 vptr和vtbl

本文探讨了C++中面向对象的高级特性,重点讲解了虚指针(vptr)和虚表(vtbl)的概念。当类含有虚函数时,内存中会包含vptr,指向vtbl。通过实例分析,阐述了如何在继承关系中实现多态,指出只有通过指针调用虚函数时,才能实现动态绑定。文章通过示例程序和输出结果,展示了动态绑定的调用规则和多态性在实际应用中的体现。
摘要由CSDN通过智能技术生成

当一个类中有一个或多个虚函数时,内存中会多一个虚指针(vptr,virtual pointer),指向一个虚表(vtbl,virtual table)

父类有虚函数,则子类一定有虚函数

在下图示意图中,我们可知,B继承A,C继承B。
A有两个虚函数,B继承A则也有两个虚函数,同时B对虚函数vfunc1进行了重写,同理,C继承B,则C也有两个虚函数,C对虚函数vfunc1也进行了重写。故在内存中,A B C对应的虚函数vfunc2是同一个均为A::vfunc2,对应的虚函数vfunc1分别为A::vfunc1,B::vfunc1,C::vfunc1。

在这里插入图片描述
c++编译器遇到函数调用时,会有两个考量,是静态绑定还是动态绑定,静态绑定是call xxx地址,即一定调用到某个地址,动态绑定可以调用到不同的地址

动态绑定需符合三个条件:

  • 通过指针调用(对象调用函数是静态绑定
  • 指针是向上的关系,向上关系是指,比如 父类 名称 = new 子类(),这样的关系即是一种向上的关系
  • 调用的是虚函数

虚函数的这种用法,称之为多态

示例程序:

#include<iostream>
using namespace std;

class A {
   
public:
	A(int data1, int data2) :m_data1(data1), m_data2(data2) {
   }
	virtual void vfunc1() {
    cout << "调用的是A的vfunc1"<< endl; }
	virtual void vfunc2() {
    cout << "调用的是A的vfunc2" << endl; }
	void func1() {
    cout << "调用的是A的func1" << endl; }
	void func2() {
    cout << "调用的是A的func2" << endl; }
	void getData
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值