C++ Daily 《5》----虚函数表的共享问题

问题:

包含一个以上虚函数的 class B, 它所定义的 对象是否共用一个虚函数表?

分析: 由于含有虚函数,因此对象内存包含了一个指向虚函数表的指针,但是这个指针指向的是同一个虚函数表吗?

实验如下:

结论:

结果表面,同一个类的所有对象,都共享同一个虚函数表。

派生问题:

派生类 和 基类是否共享同一个虚函数表呢?

C++ Daily 《5》----虚函数表的共享问题,布布扣,bubuko.com

时间: 2024-10-11 22:24:46

C++ Daily 《5》----虚函数表的共享问题的相关文章

C++中的虚函数以及虚函数表

一.虚函数的定义 被virtual关键字修饰的成员函数,目的是为了实现多态 ps: 关于多态[接口和实现分离,父类指针指向子类的实例,然后通过父类指针调用子类的成员函数,这样可以让父类指针拥有多种形态,所以称之为多态] 二.虚函数表 该表为一个类的虚函数的地址表,用于解决继承和覆盖的问题 1.拥有虚函数的类才有虚函数表 2.虚函数表属于类,然后类的所有对象通过虚函数表指针共享类的虚函数表 3.虚函数表的作用:当使用父类指针来操作子类对象时,虚函数表就像一个地图一样,指明了实际所应该调用的函数 4

关于C++中虚函数表的几点总结

虚函数表在继承层次中比较复杂,总结重要的几点如下: 1.虚函数指针一般在对象的开头或者结尾 2.虚函数表其实就是一个函数指针类型的数组 3.编译器如何知道虚函数表指针?答案是虚函数表的最后一个元素是NULL 4.当从多个基类派生时,派生类继承所有基类的虚函数指针 5.虚函数表是类级别的,类的所有对象共享同一个虚函数表 6.不同的类的对象有不同的虚函数表 7.在继承中,子类增加一个虚函数后不再单独增加一个虚函数表,而是将这个虚函数放在继承的第一个基类的虚函数表中.

虚函数 动态绑定 实现方式是:虚函数表

定义为 virtual的 函数是基类期待派生类(derived class)重定义的, 基类期待 派生类继承的函数不能定义为虚函数. 动态绑定:程序能 使用继承层次中任意类型的对象,无需关心对象的具体类型.  使用这些类的程序无须区分函数在基类还是在继承类中定义的. 尽管不是必须,派生类一般会重定义基类中的虚函数.如果没有重定义,则继承基类中定义的版本.派生类中虚函数的声明原型必须与基类中的定义方式完全匹配,但有一个例外:基类中返回值是对基类性的引用(或指针)的虚函数,在派生类中虚函数可以返回

虚函数表存放在哪里

from: here 1.虚函数表是全局共享的元素,即全局仅有一个. 2.虚函数表类似一个数组,类对象中存储vptr指针,指向虚函数表.即虚函数表不是函数,不是程序代码,不肯能存储在代码段. 3.虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不再堆中. 根据以上特征,虚函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定. 所以我推测虚函

虚指针存在证明及虚函数表

C++多态的实现原理是依赖虚指针来辨别具体使用家族类中的哪一个函数.以下就来证明虚指针的存在. 我们知道,指针的大小在一般情况下是4个字节,所以我们建立一个虚函数,再来计算该类的大小,便可以验证虚函数的存在. 代码如下: #include <iostream> using namespace std; class A { public: void print () { } private: int a ; }; class B { public: virtual void print() {

C++ 关于类与对象在虚函数表上唯一性问题 浅析

[摘要] 很多教材上都有介绍到虚指针.虚函数与虚函数表,有的说类对象共享一个虚函数表,有的说,一个类对象拥有一个虚函数表:还有的说,无论用户声明了多少个类对象,但是,这个VTABLE虚函数表只有一个:也有的在说,每个具有虚函数的类的对象里面都有一个VPTR虚函数指针,这个指针指向VTABLE的首地址,每个类的对象都有这么一种指针.今天,我们就来解决这个问题,同一个类的不同对象,是不是拥有"相同"的虚函数表,这个相同是物理上的相同(内存地址)还是逻辑上的相同(数据结构).本文现详述如下!

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据

C++对象的内存分布和虚函数表

c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数. 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员.    2.静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份.    3.静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体.在c++中类的成员函数都是保存在静态存储区中的 ,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份.    因此

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承?? 单继承:一个子类只有一个直接父类. 多继承:一个子类有两个或多个直接父类. 单继承中的虚函数表分析: 示例程序: #include <iostream> using namespace std; typedef void(*FUNC)(); class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virt