首先基类中如果含有虚函数,那么就会在该类的实例化对象的开始位置多出一个虚表指针,先于任何成员变量。这个指针指向该类所有对象共有的一张虚函数表,这张虚函数表存储这个类中所有的虚函数。

在派生类中可以重写基类中的虚函数。在程序运行时,在内存中每个类都对应一张虚函数表,每个对象都有一个虚指针。在给定了一个对象的地址时,不论这个对象是基类还是派生类,都是通过这个对象中的虚指针来找到对应类的虚函数表。

再看非虚成员函数,在编译时地址已经给定了,在调用时是根据调用对象或者指针的类型来决定。

还有成员变量,这个看图、开代码、看输出结果。

代码:

#include <iostream>using namespace std;class ClassA
{
public:int m_data1;int m_data2;ClassA(){ m_data1 = 11; m_data2 = 12; };void func1(){ cout << "ClassA::func1" << endl; };void func2(){ cout << "ClassA::func2" << endl; };virtual void vfunc1(){};virtual void vfunc2(){};
};class ClassB :public ClassA
{
public:int m_data3;ClassB(){ ClassA::m_data1 = 21; ClassA::m_data2 = 22; m_data3 = 23; };void func2(){ cout << "ClassB::func2" << endl; };virtual void vfunc1(){};
};class ClassC :public ClassB
{
public:int m_data1;int m_data4;ClassC(){ ClassA::m_data1 = 31; ClassA::m_data2 = 32; ClassB::m_data3 = 33; m_data1 = 34; m_data4 = 35; };void func2(){ cout << "ClassB::func2" << endl; };virtual void vfunc1(){};
};int main(int argc, char *argv[])
{ClassA *pa = new ClassA;ClassB *pb = new ClassB;ClassC *pc = new ClassC;ClassA *pall = NULL;cout << "pa=" << pa << endl;cout << "pb=" << pb << endl;cout << "pc=" << pc << endl;pall = pb;cout << pall->m_data1 << endl;cout << pall->m_data2 << endl;pall->func1();pall->func2();pall = pc;cout << pall->m_data1 << endl;cout << pall->m_data2 << endl;pall->func1();pall->func2();delete pa;delete pb;delete pc;return 0;
}

输出结果:


输出的成员变量分别是对象b、c的值,调用的成员函数却是基类的。

看侯俊杰讲多态的思考相关推荐

  1. 读侯俊杰的《深入浅出MFC》小记

    1.程序必须在产生窗口之前先利用API函数RegisterClass设定属性(我们称此操作为注册窗口类) 2.消息循环中的TranslateMessage是为了将键盘消息转化,DispatchMess ...

  2. C++对象模型3——vptr的位置、手动调用虚函数、从汇编代码看普通调用和多态调用

    一.vptr的位置 class test { public:int i; virtual void testfunc() {} };int main() {test a;char* p1 = rein ...

  3. Windows 程序的生与死----FROM 侯俊杰

    个人感觉比孙鑫讲的要简单,孙鑫讲的有点多了,理解不如候俊杰讲的~~~ 1. 程序初始化过程中调用CreateWindow,为程序建立了一个窗口,做为程序的萤幕舞台.CreateWindow 产生窗口之 ...

  4. 【侯捷于华科演讲】对侯老师演讲的在思考

    真正佩服的,是那些超越自己局限的人   我在一个被昵称为" 少林寺"(台湾工研院)的地方,磨练三年.后半期因为发现了自己浓烈的兴趣与不错的天赋,决定转向技术写作与教育这条路.3 0 ...

  5. Sentinel Dubbo 适配器看限流与熔断(实战思考篇)

    本文是源码分析 Sentinel 系列的第十三篇,已经非常详细的介绍了 Sentinel 的架构体系.滑动窗口.调用链上下文.限流.熔断的实现原理,相信各位读者朋友们对Sentinel有一个较为体系化 ...

  6. 在 console mode 中使用 C/C++ 编译器 (作者:侯俊杰)

    在 console mode 中使用 C/C++ 编译器 侯捷 1999.04.08 侯捷 1999.04.08 我总是鼓励 C/C++ 的学习者,在刚接触这个程式语言的时候,先以 console m ...

  7. 从汉诺塔讲递归的思考方式

    想象你来到某个热带丛林,意外发现了十层之高的汉诺塔.正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔.他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱. 你灵机 ...

  8. 韩顺平循序渐进学java 第12讲 多态

    12.1 多态-四大特征之四 12.1.1 概念 所谓多态,就是指一个引用(类型)在不同情况下的多种状态. 可以这样理解:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 12.1.2 注意 ...

  9. jmeter tps指标在哪里看_jmeter性能测试讲的很详细

    提问1 如何在大并发测试下,让登录或者后续接口只执行一次? 回答 这个问题网上的答案其实很多,但是大多不靠谱. 比如推荐使用仅一次控制器,但是仅一次控制器对线程组无效:比如推荐跨线程组调用,但是这样比 ...

最新文章

  1. 不用任何数学方法,如何计算圆面积
  2. 431.chapter2.configure database mail
  3. python moviepy 音量_python moviepy 视频剪辑代码
  4. 获取table控件的某行某列
  5. 图片查看器-Python-tkinter
  6. 20种专业电影胶片调色luts预设
  7. CF869C The Intriguing Obsession
  8. 制作一个简单的chrome插件
  9. apk很小 白屏时间长_小精灵启动后会白屏很久
  10. ftp下载工具绿色版,网络上难找的绿色版ftp下载工具
  11. X11 Wayland 及 Mir 比较
  12. Android实训-家庭财务管理系统
  13. xml解析方式与效率对比
  14. 自定义SSLSocketFactory
  15. Java常用类思维导图总结
  16. 焚风现象(差分模板题)
  17. Web Audio API之手把手教你用web api处理声音信号:可视化音乐demo
  18. .net课后练习-html制作一个个人简历
  19. 信息学奥赛一本通1072:鸡尾酒疗法
  20. 各个段位 毕业要准备几篇论文,毕业太难了。

热门文章

  1. MATLAB生成脉冲序列:pulstran 函数使用简记:
  2. InnovMetric PolyWorks Metrology Suite 2021 IR2
  3. 社保卡应用名称、标识符及文件系统的介绍
  4. Go 语言标识符、包名规范
  5. AC-Campus准入控制--802.1x
  6. php声波模拟开门,PHP 根据wav文件绘制声波图
  7. 基于JAVA解决淘宝爬虫限制
  8. R语言绘图 | 折线图画法,如何画出你满意的图?
  9. html5怎么做成五行五列,word将文字转换成五行五列的表格怎么做
  10. 西门子SMART-200通信