证明vptr指针的存在

本文通过两个简单的C++类示例对比,展示了虚函数机制如何影响类的大小。其中一个类包含虚函数,其大小为8字节;另一个没有虚函数,大小为4字节。这揭示了虚函数表指针在类实例中所占的空间。
#include<iostream>
using namespace std;

class parent1
{
public:
    int a;
public:
    virtual void f()
    {

    }
};

class parent2
{
public:
    int a;
public:
    void f()
    {

    }
};
int main()
{
    cout << "sizeof(parent1) = " << sizeof(parent1) << endl; //结果为8
    cout << "sizeof(parent2) = " << sizeof(parent2) << endl; //结果为4
    return 0;
}
### 多态的原理 C++ 中的虚函数实现了多态的机制,也就是用父类型指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,这种技术可以让父类的指针有“多种形态”,这也是一种泛型技术,也就是使用不变的代码来实现可变的算法[^4]。 多态成立需要满足三个条件,当存在虚函数时,每个对象中都有一个指向虚函数的指针C++ 编译器给父类对象、子类对象提前布局 vptr 指针),当进行相关函数调用时,C++ 编译器不需要区分子类或者父类对象,只需要在指针中找到 vptr 指针即可[^1][^3]。 ### vptr 指针相关内容 vptr 指针即虚函数表指针,每个包含虚函数的类的对象都会有一个 vptr 指针。该指针指向一个虚函数表(Virtual Table,简称 VTable),虚函数表是一个存储类成员虚函数地址的数组。 在程序运行时,当通过基类指针或引用调用虚函数时,编译器会通过该对象的 vptr 指针找到对应的虚函数表,再从虚函数表中找到并调用实际要执行的虚函数。例如下面的代码示例: ```cpp #include <iostream> class Base { public: virtual void print() { std::cout << "Base::print()" << std::endl; } }; class Derived : public Base { public: void print() override { std::cout << "Derived::print()" << std::endl; } }; int main() { Base* basePtr = new Derived(); basePtr->print(); // 通过基类指针调用虚函数,会根据 vptr 找到 Derived 类的 print 函数 delete basePtr; return 0; } ``` 在这个示例中,`basePtr` 虽然是 `Base` 类型的指针,但它指向的是 `Derived` 类的对象。当调用 `basePtr->print()` 时,编译器会通过 `basePtr` 指向对象的 vptr 指针找到 `Derived` 类的虚函数表,从而调用 `Derived::print()` 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值