1.虚函数

虚函数是c++实现多态的有力武器,声明虚函数只需在函数前加上virtual关键字,虚函数的定义不用加virtual关键字。

2.虚函数要点

(1) 静态成员函数不能声明为虚函数

可以这么理解,虚函数是个动态的概念,在运行的时候才决定调用哪个,而静态函数是个静态的概念。更加细化的解释是,静态函数与对象无关,不可以用对象实例调用,显然是与虚函数的概念违背的。

(2)构造函数不能是虚函数

很明显,虚函数表的建立都是在构造函数中进行的,如果构造函数是虚函数的话,就变成了鸡生蛋蛋生鸡的问题了。

(3)析构函数最好是虚函数

析构函数最好是虚函数,除非不想作为基类使用,声明称虚函数是个好习惯,这样delete用父类指针指向的子类对象就可以自动找到子类的析构函数了。

3.虚函数表在内存中的构造(gcc)

虚函数表一般在对象所占内存的最开始的位置。

(1)无继承

无继承的话讨论虚函数无意义,但是需要说明的是此时虚函数按照声明的顺序摆放。

(2)一般继承,无虚函数覆盖

这样的话,虚函数表中先放父类虚函数指针,再按声明顺序摆放自己的虚函数指针

(3)单继承,有虚函数覆盖

子类对象的虚函数表中覆盖父类虚函数的位置放置自己的虚函数指针,其他同(2)

(4)多重继承

多重继承意味着有多个虚函数表,自己独有的虚函数放置在第一个虚函数列表的尾部。


这篇总结实际上是网上的一篇博文总结,该博文总结得非常好,所以我就摘录了过来。

补充:

4.GCC和VC中对虚函数,虚基类内存布局的不同

  要点:在普通继承时没区别,单继承时虚函数表是共享的,但是虚继承时,vc环境下,虚函数指针时不共享的,也就意味着多一个新的虚函数就得额外多一个指针。

5.关于虚函数、多态、内存布局的一个例子

6.多态的相关概念

  比较清楚地描述了重载、隐藏、覆盖的区别

C++ 虚函数表与内存模型的更多相关文章

  1. C++ 虚函数表与多态 —— 虚函数表的内存布局

       C++面试经常会被问的问题就是多态原理.如果对C++面向对象本质理解不是特别好,问到这里就会崩. 下面从基本到原理,详细说说多态的实现:虚函数 & 虚函数表.   1. 多态的本质: 形 ...

  2. C++虚函数和虚函数表

    前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构. 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: #include <iostream> ...

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

    [摘要] 非常多教材上都有介绍到虚指针.虚函数与虚函数表.有的说类对象共享一个虚函数表,有的说,一个类对象拥有一个虚函数表.还有的说,不管用户声明了多少个类对象,可是,这个VTABLE虚函数表仅仅有一 ...

  4. C++对象内存模型2 (虚函数,虚指针,虚函数表)

    从例子入手,考察如下带有虚函数的类的对象内存模型: class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1 ...

  5. C++对象内存模型2 (虚函数,虚指针,虚函数表)(转)

    class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2(); virtual ...

  6. vs查看虚函数表和类内存布局

    虚继承和虚基类 虚继承:在继承定义中包含了virtual关键字的继承关系:     虚基类:在虚继承体系中的通过virtual继承而来的基类,需要注意的是:class CSubClass : publ ...

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

    c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数. 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员.    2.静态数据成员被提取出来放在程序的静态数据 ...

  8. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

  9. C++对象的内存布局以及虚函数表和虚基表

    C++对象的内存布局以及虚函数表和虚基表 本文为整理文章, 参考: http://blog.csdn.net/haoel/article/details/3081328 http://blog.csd ...

随机推荐

  1. js常识

    btnDelAll.Attributes.Add("onclick", "<script lunguage='javascript'>return windo ...

  2. 破解之寻找OEP[手动脱壳](1)

    OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳. PUSHAD (压栈) 代表程序的 ...

  3. [BEC][hujiang] Lesson04 Unit1:Working life ---Reading + Listening &Grammar & Speaking

    4 1.1 Working life    P10 Reading----The anonymous CV Exercise 3  What should be included in the CV ...

  4. 【图说】Eclipse与Unity 3D协同工作

    原地址:http://blog.csdn.net/h570768995/article/details/9355313 Eclipse开发过程中总会碰到很多的难题,如何利用好工具帮助我们更快捷的开发也 ...

  5. VC 最爱问的问题:你这个创业项目,如果腾讯跟进了,而且几乎是产品上完全复制,你会怎么办?

    VC 最爱问的问题:你这个创业项目,如果腾讯跟进了,而且几乎是产品上完全复制,你会怎么办? http://www.zhihu.com/question/19607233 朱继玉,独立精神,自由思想. ...

  6. Spring MVC Checkbox And Checkboxes Example

    In Spring MVC, <form:checkbox /> is used to render a HTML checkbox field, the checkbox values ...

  7. 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下-复制代码 代码如下:    #ifndef USE_H_     ...

  8. Object-C中emoji与json的问题

    遇到一个问题,要储存iOS键盘输出的emoji表情到MySQL,我知道用blob+utf8是可以存的.但是现在我的这张表已经太大了,不可能去改类型.所以就想把emoji表情匹配出来,替换掉,再存.但是 ...

  9. iOS开发--TableView详细解释

    -.建立 UITableView  DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)];  [Data ...

  10. 50个非常有用的PHP工具

    PHP是使用最为广泛的开源服务器端脚本语言之一,当然PHP并不是速度最快的,但它却是最常用的脚本语言.这里有50个有益的PHP工具,可以大大提高你的编程工作: 调试工具 Webgrind Xdebug ...