原文:http://blog.csdn.net/haoel/article/details/1948051 一、简介 C++中的虚函数的作用主要是实现了多态的机制。虚函数(Virtual Function)其实是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中 ...
分类:
编程语言 时间:
2017-03-09 13:15:03
阅读次数:
262
from: here 1.虚函数表是全局共享的元素,即全局仅有一个. 2.虚函数表类似一个数组,类对象中存储vptr指针,指向虚函数表.即虚函数表不是函数,不是程序代码,不肯能存储在代码段. 3.虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期可以确定, ...
分类:
其他好文 时间:
2017-03-01 17:52:23
阅读次数:
408
1.类的内存分布 空类为了占位,空间占一个字节 成员函数,静态函数,静态变量并不占内存(不和类放在一起) 所有的虚函数也并不和类放在一起,而是将所有的虚函数构造成一个虚函数表,用一个指针指向这个虚函数表,类仅仅存储这个指针,一个指针在32位的机器上占四个字节 所有的非静态成员变量占内存 因此,类的内 ...
分类:
其他好文 时间:
2017-02-26 15:50:42
阅读次数:
217
本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解。 结论: 1、通常的类型强转是告诉编译器必须按照指定结构的内存布局来解析对应内存,如上例中“child2* pc21=(child2*)&c1; ”,编译器会把c1对应的内存来当做Deri ...
分类:
编程语言 时间:
2017-02-12 20:57:19
阅读次数:
203
一、继承的本质 1、在c++编译器的内部类可以理解为结构体 2、子类是由父类成员叠加子类新成员得到的 二、多态的本质 1、当类中声明一个虚函数时,编译器会在类中生成一个虚函数表 2、虚函数表是一个存储成员函数地址的数据结构 3、虚函数表是由编译器自动生成与维护的 4、virtual成员函数会被编译器 ...
分类:
编程语言 时间:
2017-02-06 11:01:54
阅读次数:
307
1.无继承的普通类: 在有虚函数的情况下类会为其增加一个隐藏的成员,虚函数表指针,指向一个虚函数表,虚函数表里面就是类的各个虚函数的地址了。那么,虚函数表指针是以什么模型加入到类里面的,虚函数表里面又是怎么安排的呢。简单来看下就可以知道了。 定义一个A的变量,然后看其内存布局: 最开始的 4个字节就 ...
分类:
编程语言 时间:
2017-01-17 08:02:54
阅读次数:
253
首先,我写了一个构造函数用virtual修饰的类A,代码如下:classA
{
public:
virtualA()
{}
};运行结果:(我是在VS下运行的)可以看出这样的代码编译时是有问题的。为什么构造函数不能是虚函数呢?这里你需要知道一个概念,那就是虚函数表vtbl,每一个拥有虚成员函数的类都有..
分类:
其他好文 时间:
2017-01-03 08:38:25
阅读次数:
209
static_cast reinterpret_cast dynamic_cast const_cast 1.**static_cast 运算符完成相关类型之间的转换** 使用场景:如在同一类层次结构中的一个指针类型到另一个指针类型,整型到枚举类型,或者浮点型到整型等。 例: 1, int m=10 ...
分类:
编程语言 时间:
2016-12-20 00:38:00
阅读次数:
231
1.非virtual函数,调用规则取决于对象的显式类型。例如 A* a = new B(); a->display(); 调用的就是A类中定义的display()。和对象本体是B无关系。 2.virtual函数,具体调用哪个版本,取决于虚函数表。例如 A* a = new B(); a->v_dis ...
分类:
编程语言 时间:
2016-12-15 14:10:42
阅读次数:
213
前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构。 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: class A 和 class B 都有一个虚函数,然后 class C 继承 A 和 B。在VS2010中,查看变量: 如图所示,局部变量中只显示 ...
分类:
编程语言 时间:
2016-11-22 16:53:31
阅读次数:
141