一般我们说虚函数,它的访问级别都是public的,用类对象可以直接调用,这样就可以实现运行时的类型绑定,那如果我们将虚函数私有化会出现什么情况呢?

我们先来看一个非虚函数私有化的例子

class Base
{
private:void PrintClassName (){cout<<"Base"<<endl;}
public:void print(){PrintClassName();}
};class Derived : public Base
{
private:void PrintClassName(){cout<<"Derived"<<endl;}
};

在main函数里产生一个Derived的对象d,然后调用print()函数,即d.print(),结果输出的却是Base,print()函数没有调用子类的PrintClassName函数,而是调用父类的PrintClassName函数,原来是由于PrintClassName函数不是虚函数之故,所以Base的print()函数调用PrintClassName()函数是在编译时就已经绑定了,而不是运行期绑定。

下面我们让PrintClassName()函数变成虚函数再执行,就可以看到输出的类名为子类的名称,即Derived。

那么我们有没有办法调用私有的虚函数呢?当然是有的,不管公有还是私有,只要是虚函数,它的函数地址都会放在虚函数表vftable中,只要我们找到虚函数表中存放的PrintClassName()函数的地址,我们就可以直接调用,前提是你必须对C++类对象的内存布局要熟悉,代码如下,这样也输出Derived,与前面效果相同

int _tmain(int argc, _TCHAR* argv[])
{Derived d;//d.print();typedef void (*Fun)();Fun pFun = NULL;pFun = (Fun)*((int *)(*(int *)&d + 0) + 0);pFun();getchar();return 0;
}

转载于:https://www.cnblogs.com/venow/archive/2012/08/08/2446931.html

C++之private虚函数相关推荐

  1. C/C++基础语法复习(三):C++重载函数,多态,虚函数

    1.重载运算符和重载函数: C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它 ...

  2. 纯虚函数能为private吗?

    我们把一个仅仅含有纯虚函数的类称为接口,我们也好像已经习惯了将这个接口中的所有纯虚函数全声明为public,而且按照这样的设计,一切都工作得不错.比如COM正是这样做的,它的接口中几乎不会存在priv ...

  3. 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码

    虚函数:在以下几个方面,虚函数可能会造成性能损失:构造函数必须初始化vptr(虚函数表):虚函数是通过指针间接调用的,所以必须先得到指向虚函数表的指针,然后再获得正确的函数偏移量:内联是在编译时决定的 ...

  4. C++多态中虚函数的深入理解

    c++中动态多态性是通过虚函数来实现的.静态多态性是通过函数的重载来实现的,在程序运行前的一种早绑定,动态多态性则是程序运行过程中的一种后绑定.根据下面的例子进行说明. #include <io ...

  5. 空类,虚函数类,虚继承类的空间大小

    //此代码在32位win下运行成功 #include<iostream> using namespace std; class A//A是空类,编译器会用一个char类型标记这个类,大小为 ...

  6. linux 虚函数调用性能,C++虚函数和多态

    跟狄泰软件学院的唐老师学习C++已经有一段时间了,发现虚函数的概念一直不是很清楚,今天把唐老师的课程重新看了一下,先将相关知识点总结一下. 一.多态的概念 多态值通过类的指针(引用)调用类的方法时,根 ...

  7. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  8. C++编程进阶5(内联函数、如何降低编译成本、处理继承体系中同名不同参的成员函数、私有虚函数)

    十七.内联函数 在https://blog.csdn.net/Master_Cui/article/details/106391552中,已经简单的说过内联函数的作用. 函数体较小的内联函数经过编译后 ...

  9. C++之多态性与虚函数

    面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了&quo ...

最新文章

  1. linux系统命令学习系列-文件和目录管理
  2. hadoop思维导图
  3. php-fpm 进程管理
  4. android实践项目一实现简单的验证码和spinner下拉选项效果
  5. Windows 窗设计时结构
  6. 介绍一位高级数据分析师,告诉你数据分析原来这么好玩
  7. 如果用户访问一个不存在的地址呢?
  8. C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载
  9. HDFS剩余空间大小的Java接口,java api获取hdfs索引大小
  10. 基于Bootstrap的Asp.net Mvc 分页的实现(转)
  11. 苹果笔记本安装Win10双系统+分区教程《完整精华版》
  12. G.703接口和E1接口区别
  13. Erphp loggedin 异地IP登录自动禁封用户 WordPress插件
  14. mac抹掉磁盘重装系统未能与服务器取得联系_如何用U盘自制Mac笔记本系统重装盘...
  15. 母亲节板报图片计算机方案,母亲节电子手抄报图片大全
  16. 工兵扛军旗游戏新玩法
  17. 蓝牙耳机录音进行讯飞语音识别
  18. USB Type-C Configuration Channel (CC)引脚功能介绍
  19. python中geometry_python shapely.geometry.polygon任意两个四边形的IOU计算实例
  20. Cmake学习实战-基础篇

热门文章

  1. 七值逻辑与基本数据类型
  2. C++中public,protected,private派生类继承问题和访问权限问题
  3. 一个有意思的CStatic和combobox以及Cedit控件结合使用
  4. android 清空所有控件,如何清空android ListView控件的内容
  5. java 字符串子串_java实现字符串匹配求两个字符串的最大公共子串
  6. python模块管理工具,Python的包管理工具
  7. 台式计算机计量单位,计算机的计量单位以及常见的数据类型
  8. php中tables,php显示TABLE数据
  9. 在javascript中,如何判断一个被多次encode 的url 已经被decode到原来的格式?
  10. Unity3D在C#编程中的一些命名空间的引用及说明