看侯俊杰讲多态的思考
首先基类中如果含有虚函数,那么就会在该类的实例化对象的开始位置多出一个虚表指针,先于任何成员变量。这个指针指向该类所有对象共有的一张虚函数表,这张虚函数表存储这个类中所有的虚函数。
在派生类中可以重写基类中的虚函数。在程序运行时,在内存中每个类都对应一张虚函数表,每个对象都有一个虚指针。在给定了一个对象的地址时,不论这个对象是基类还是派生类,都是通过这个对象中的虚指针来找到对应类的虚函数表。
再看非虚成员函数,在编译时地址已经给定了,在调用时是根据调用对象或者指针的类型来决定。
还有成员变量,这个看图、开代码、看输出结果。
代码:
#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的值,调用的成员函数却是基类的。
看侯俊杰讲多态的思考相关推荐
- 读侯俊杰的《深入浅出MFC》小记
1.程序必须在产生窗口之前先利用API函数RegisterClass设定属性(我们称此操作为注册窗口类) 2.消息循环中的TranslateMessage是为了将键盘消息转化,DispatchMess ...
- C++对象模型3——vptr的位置、手动调用虚函数、从汇编代码看普通调用和多态调用
一.vptr的位置 class test { public:int i; virtual void testfunc() {} };int main() {test a;char* p1 = rein ...
- Windows 程序的生与死----FROM 侯俊杰
个人感觉比孙鑫讲的要简单,孙鑫讲的有点多了,理解不如候俊杰讲的~~~ 1. 程序初始化过程中调用CreateWindow,为程序建立了一个窗口,做为程序的萤幕舞台.CreateWindow 产生窗口之 ...
- 【侯捷于华科演讲】对侯老师演讲的在思考
真正佩服的,是那些超越自己局限的人 我在一个被昵称为" 少林寺"(台湾工研院)的地方,磨练三年.后半期因为发现了自己浓烈的兴趣与不错的天赋,决定转向技术写作与教育这条路.3 0 ...
- Sentinel Dubbo 适配器看限流与熔断(实战思考篇)
本文是源码分析 Sentinel 系列的第十三篇,已经非常详细的介绍了 Sentinel 的架构体系.滑动窗口.调用链上下文.限流.熔断的实现原理,相信各位读者朋友们对Sentinel有一个较为体系化 ...
- 在 console mode 中使用 C/C++ 编译器 (作者:侯俊杰)
在 console mode 中使用 C/C++ 编译器 侯捷 1999.04.08 侯捷 1999.04.08 我总是鼓励 C/C++ 的学习者,在刚接触这个程式语言的时候,先以 console m ...
- 从汉诺塔讲递归的思考方式
想象你来到某个热带丛林,意外发现了十层之高的汉诺塔.正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔.他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱. 你灵机 ...
- 韩顺平循序渐进学java 第12讲 多态
12.1 多态-四大特征之四 12.1.1 概念 所谓多态,就是指一个引用(类型)在不同情况下的多种状态. 可以这样理解:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 12.1.2 注意 ...
- jmeter tps指标在哪里看_jmeter性能测试讲的很详细
提问1 如何在大并发测试下,让登录或者后续接口只执行一次? 回答 这个问题网上的答案其实很多,但是大多不靠谱. 比如推荐使用仅一次控制器,但是仅一次控制器对线程组无效:比如推荐跨线程组调用,但是这样比 ...
最新文章
- 不用任何数学方法,如何计算圆面积
- 431.chapter2.configure database mail
- python moviepy 音量_python moviepy 视频剪辑代码
- 获取table控件的某行某列
- 图片查看器-Python-tkinter
- 20种专业电影胶片调色luts预设
- CF869C The Intriguing Obsession
- 制作一个简单的chrome插件
- apk很小 白屏时间长_小精灵启动后会白屏很久
- ftp下载工具绿色版,网络上难找的绿色版ftp下载工具
- X11 Wayland 及 Mir 比较
- Android实训-家庭财务管理系统
- xml解析方式与效率对比
- 自定义SSLSocketFactory
- Java常用类思维导图总结
- 焚风现象(差分模板题)
- Web Audio API之手把手教你用web api处理声音信号:可视化音乐demo
- .net课后练习-html制作一个个人简历
- 信息学奥赛一本通1072:鸡尾酒疗法
- 各个段位 毕业要准备几篇论文,毕业太难了。