c++多态之——vptr指针

c++多态之——vptr指针
之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性。后来,发现它就是c++编译器给我们添加的vptr指针。

当类中声明虚函数时,编译器会在类中生成一个虚函数表;

虚函数表是一个存储成员函数指针的数据结构;

虚函数表是由编译器自动生成与维护的;

virtual成员函数会被编译器放入虚函数表中;

存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针)

在实现多态的过程中,父类和派生类都有vptr指针。

对象中的vptr指针什么时候被初始化:

对象在创建时,由编译器对vptr指针进行初始化;

只有当对象的构造完全结束后vptr的指向才最终决定下来;

父类对象的vptr指向父类的虚函数表,子类对象的vptr指向子类的虚函数表。

定义子类对象时,vptr先指向父类的虚函数表,在父类构造完成之后,子类的vptr才指向自己的虚函数表。(这也就是在父类或者子类的构造函数中调用虚成员函数不会实现多态的原因,这是一道面试题)

转载自:
https://www.cnblogs.com/yangguang-it/p/6547314.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++多态是面向对象编程中一个非常重要的特性,它能够让我们在编写代码时更加灵活,同时也提高了代码的可维护性和可扩展性。多态的实现原理主要是通过虚函数和指针实现的。 在C++中,我们可以通过将父类中的函数声明为虚函数来实现多态。一个类中如果有虚函数,那么就会生成一个虚函数表(vtable),这个表中存储着虚函数的地址。在编译时,编译器会为每个对象分配一个指向虚函数表的指针vptr),这个指针会被存储在对象的内存布局中。 当我们通过一个父类的指针或引用来调用一个虚函数时,实际上会根据对象的类型来查找对应的虚函数表,然后再根据虚函数表中的函数地址来调用实际的函数。这个过程被称为动态绑定(dynamic binding),这样就能够实现多态了。 以下是一个简单的示例: ```C++ class Animal { public: virtual void speak() { cout << "I am an animal" << endl; } }; class Dog : public Animal { public: void speak() { cout << "I am a dog" << endl; } }; Animal* animal = new Animal(); Animal* dog = new Dog(); animal->speak(); // 输出 I am an animal dog->speak(); // 输出 I am a dog ``` 在上面的示例中,Animal和Dog都有一个speak()函数,其中Animal的speak()函数是虚函数。当我们通过Animal指针调用speak()函数时,会调用Animal的speak()函数;当我们通过Dog指针调用speak()函数时,会调用Dog的speak()函数。这就是多态的实现过程。 总的来说,C++多态能够通过虚函数和指针来实现,它能够让我们在编写代码时更加灵活,同时也提高了代码的可维护性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值