#include <iostream>
using namespace std; class Base
{
public :
void display()
{
cout << "Base display" << endl;
} void (Base :: **VTable)();//指向虚表的函数指针
int a;
}; class Derived : public Base
{
public :
void display()
{
cout << "derived display" << endl;
}
}; void test(Base *pointer)
{
void (Base :: *pFunc)() = (void(Base :: *)())pointer->VTable[];
(pointer->*pFunc)();
} int main()
{
//多态是通过多余的存储空间存储了虚函数的地址,通过函数指针来实现虚函数的调用
//1.分配空间+4,成员变量从+4的位置开始了。最上面的控件保留一个指针。
//2.为该指针指向的地址分配一块存储空间
//3.将所有虚函数的地址存储到这块存储空间中,这个存储空间称为虚表     //初始化工作,也就是编译器帮我们做的事
Derived *derived = new Derived();
derived->VTable = (void(Base :: **)())new int[];
derived->VTable[] =(void(Base :: *)()) &Derived :: display;//初始化工作
test(derived); Base *base = new Base();
base->VTable = (void(Base :: **)())new int[];
base->VTable[] = (void(Base :: *)()) &Base :: display;
test(base);
system("pause");
return ;
}

基类如果不使用虚函数virtual构成多态的话,使用sizeof得到Base的大小为4,如下图(Base中的成员变量只有一个int a,使用32位编译器,如下代码中的基类,只是演示使用)

 #include <iostream>
using namespace std; class Base
{
public :
void display()
{
cout << "Base display" << endl;
} int a;
}; class Derived : public Base
{
public :
void display()
{
cout << "derived display" << endl;
}
}; int main()
{
cout << "Base's size is " << sizeof(Base) << endl;
system("pause");
return ;
}

如果使用virtual构成虚函数,再使用sizeof测试基类的大小,会发现基类大小增加了4

#include <iostream>
using namespace std; class Base
{
public :
virtual void display()
{
cout << "Base display" << endl;
} int a;
}; class Derived : public Base
{
public :
void display()
{
cout << "derived display" << endl;
}
}; int main()
{
cout << "Base's size is " << sizeof(Base) << endl;
system("pause");
return ;
}

那这个 4byte的空间是什么东西?是干什么用?

经过向父类加入多个虚函数,测试之后发现还是只是增加4byte,那么只有指针可以做到。

这个指针是一个二级指针,指向一个虚表的地址,虚表中存储的是父类与子类同名函数的地址。(比较复杂,我也只能理解到这个地步,所以表达更是low)

/**********************************************************************************2017/7/20,以后有了更深的理解再继续更新******************************************************************************************/

使用函数指针模拟C++多态的更多相关文章

  1. C用函数指针模拟重载 C++重载

    C中为什么不支持重载,即同一作用域内不允许出现同名函数? 我们都知道重载是c++面向对象的特性.c语言中是不存在的.所谓重载简单来说就是一个函数名可以实现不同的功能,要么输入参数不同或者参数个数不同, ...

  2. 关于函数指针与c++多态

    原文  https://www.cnblogs.com/zhchngzng/p/4013031.html 虚函数是实现多态的重要元素,请看: class A { public: void a0(){c ...

  3. c 结构体 & 函数指针模拟实现一个java class(类) 和方法

    闲来无事,纯粹练习. student.h #ifndef STUDENT_H_INCLUDED #define STUDENT_H_INCLUDED #include <memory.h> ...

  4. 使用函数指针和多态代替冗长的if-else或者switch-case

    在编程中,if-else和switch-case是很常见的分支结构,很少在程序中不用这些控制语句.但是不能否认,在一些场景下,由于分支结构过分长,导致代码不美观且不容易维护,在<重构>一书 ...

  5. C 语言实现多态的原理:函数指针

    C语言实现多态的原理:函数指针 何为函数指针?答案:C Programming Language. 能够查阅下,从原理上来讲,就是一个内存地址.跳过去运行相应的代码段. 既然如此,在运行时决定跳到哪个 ...

  6. C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)

    //多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...

  7. 2014 0416 word清楚项目黑点 输入矩阵 普通继承和虚继承 函数指针实现多态 强弱类型语言

    1.word 如何清除项目黑点 选中文字区域,选择开始->样式->全部清除 2.公式编辑器输入矩阵 先输入方括号,接着选择格式->中间对齐,然后点下面红色框里的东西,组后输入数据   ...

  8. 你必须知道的指针基础-7.void指针与函数指针

    一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...

  9. typedef 函数指针 数组 std::function

    1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA,  *PDATA;  //D ...

随机推荐

  1. ArrayList和Map的一些知识

    2014年10月17日16:39:01 1.如何获取某条数据在ArrayList中的索引值? 多个对象存储的ArrayList中,如果只知道对象其中的一个属性,如何获取该对象在ArrayList里的索 ...

  2. 使用Xftp连接Centos 6.6服务器详细图文教程

    这篇文章主要介绍了使用Xftp连接Centos 6.6服务器详细图文教程,本文用详细的图文说明讲解了连接服务器和操作服务器的步骤,适合新手,需要的朋友可以参考下 一,打开Xftp软件(下载地址:Xma ...

  3. js另存为、打印、属性、加入收藏、关闭等代码

    js打开代码 <input name=Button onClick=document.all.WebBrowser.ExecWB(1,1) type=button value=打开> &l ...

  4. Bootstrap+Ajax+HTML 动态表格分页

      1.HTML页面:(bootstrap的模态框) 触发模态框: <div class="col-lg-6"> <div class="input-g ...

  5. Python 中类和实例的通俗讲解

    本文为转载整理,我转过来作为备份留作自己查看,请点击链接阅读原文.原文链接为:点此 Python类与实例的讲解,相当通俗易懂.非常推荐! class Person: 注意,类的名称一般用大写字母开头, ...

  6. 使用UI Automation实现自动化测试--5-7

    使用UI Automation实现自动化测试--5 (Winfrom和WPF中弹出和关闭对话框的不同处理方式) 在使用UI Automation对Winform和WPF的程序测试中发现有一些不同的地方 ...

  7. easyUI学习笔记二

    1.  拖拉大小 <!DOCTYPE html> <html> <head> <title>easyui学习</title> <scr ...

  8. python面试题之简要描述Python的垃圾回收机制(garbage collection)

    这里能说的很多.你应该提到下面几个主要的点: Python在内存中存储了每个对象的引用计数(reference count).如果计数值变成0,那么相应的对象就会小时,分配给该对象的内存就会释放出来用 ...

  9. windows自动关机(任务计划程序 + exe文件)

    需求:windows系统自动关机 的需求: 相关工具:win10系统中,使用windows自带的任务计划程序 和 windows自带的关机 exe文件 完成此需求 exe文件位置:C:\Windows ...

  10. 图形设计 X11

    显示适配器驱动程序安装范例 AMD驱动加载 Intel驱动加载