C++中的多态与虚函数的内部实现
/******************************************************************************************************
* File:PolymorphismTest
* Introduction:测试多态的一些特性。
* Author:CoderCong
* Date:20141114
* LastModifiedDate:20160113
*******************************************************************************************************/
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
void foo()
{
printf("1\n");
}
virtual void fun()
{
printf("2\n");
}
};
class B : public A
{
public:
void foo() //由于基类的foo函数并不是虚函数,所以是隐藏,而不是重写
{
printf("3\n");
}
void fun() //重写
{
printf("4\n");
}
};
int main(void)
{
A a;
B b;
A *p = &a;
p->foo(); //输出1。
p->fun(); //输出2。
p = &b;
p->foo(); //输出1。因为p是基类指针,p->foo指向一个具有固定偏移量的函数。也就是基类函数
p->fun(); //输出4。多态。虽然p是基类指针,但实际上指向的是一个子类对象。p->fun指向的是一个虚函数。按照动态类型,调用子类函数
return ;
}
4、运行时多态以及虚函数的内部实现
class A
{
public:
virtual void FunA()
{
cout << "FunA1" << endl;
};
virtual void FunAA()
{
cout << "FunA2" << endl;
}
};
class B
{
public:
virtual void FunB()
{
cout << "FunB" << endl;
}
};
class C :public A, public B
{
public:
virtual void FunA()
{
cout << "FunA1C" << endl;
};
}; int _tmain(int argc, _TCHAR* argv[])
{
C objC;
A *pA = &objC;
B *pB = &objC;
C *pC = &objC; 38 printf("%d %d\n", &objC, objC);
printf("%d %d\n", pA, *pA);
printf("%d %d\n", pB, *pB);
printf("%d %d\n", pC, *pC); return ;
}
运行结果:
5241376 1563032
5241376 1563032
5241380 1563256
class A
{
public:
virtual void FunA()
{
cout << "FunA1" << endl;
}
virtual void FunA2()
{
cout << "FunA2" << endl;
}
}; class C :public A
{
virtual void FunA()
{
cout << "FunA1C" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A *pA = new A;
C *pC = new C;
typedef void (*Fun)(void); Fun fun= (Fun)*((int*)(*(int*)pA));
fun();//pA指向的第一个函数
fun = (Fun)*((int*)(*(int*)pA) +);
fun();//pA指向的第二个函数
fun = (Fun)*((int*)(*(int*)pC));
fun();//pC指向的第一个函数
fun = (Fun)*((int*)(*(int*)pC) + );
fun();//pC指向的第二个函数
return ;
}
运行结果:
FunA2
FunA1C
FunA2
int _tmain(int argc, _TCHAR* argv[])
{
C objC;
A *pA = &objA;
B *pB = &objC;
C *pC = &objC;
typedef void (*Fun)(void); Fun fun = (Fun)*((int*)(*(int*)pC));
fun();//第一个表第一个函数
fun = (Fun)*((int*)(*(int*)pC)+);
fun();//第一个表第二个函数
fun = (Fun)*((int*)(*((int*)pC+)));
fun();<span style="white-space:pre"> </span>//第二个表第一个函数
fun = (Fun)*((int*)(*(int*)pB));
fun();//pB指向的表的第一个函数
return ;
}
哈哈,和我们的猜测完全一致:
FunA2
FunB
FunB

C++中的多态与虚函数的内部实现的更多相关文章
- C++中的多态及虚函数大总结
多态是C++中很关键的一部分,在面向对象程序设计中的作用尤为突出,其含义是具有多种形式或形态的情形,简单来说,多态:向不同对象发送同一个消息,不同的对象在接收时会产生不同的行为.即用一个函数名可以调用 ...
- 详解C++中的多态和虚函数
一.将子类赋值给父类 在C++中经常会出现数据类型的转换,比如 int-float等,这种转换的前提是编译器知道如何对数据进行取舍.类其实也是一种数据类型,也可以发生数据转换,但是这种转换只有在 子类 ...
- 【转载】 C++多继承中重写不同基类中相同原型的虚函数
本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...
- C++多态、虚函数、纯虚函数、抽象类、虚基类
一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...
- C++多态、虚函数、纯虚函数、抽象类
多态 同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态. 两种多态: (1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数. (2)动态多态(简称多态) ...
- 转 C++中不能声明为虚函数的有哪些函数
传送门 C++中不能声明为虚函数的有哪些函数 常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数 ...
- C++中的继承与虚函数各种概念
虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个 ...
- C++ 基础语法 快速复习笔记(3)---重载函数,多态,虚函数
1.重载运算符和重载函数: C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它 ...
- 《挑战30天C++入门极限》C++中类的多态与虚函数的使用
C++中类的多态与虚函数的使用 类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持 ...
随机推荐
- 字符串js编码转换成实体html编码的方法(防范XSS攻击)
js代码在html页面中转换成实体html编码的方法一: <!DOCTYPE html><html> <head> <title>js代码转换成实 ...
- Django--models基础
需求 了解models字段和参数 速查 models.py 1 2 3 class UserInfo(models.Model): ctime = models.DateTimeField( ...
- 价值100W的经验分享: 基于JSPatch的iOS应用线上Bug的即时修复方案,附源码.
限于iOS AppStore的审核机制,一些新的功能的添加或者bug的修复,想做些节日专属的活动等,几乎都是不太可能的.从已有的经验来看,也是有了一些比较常用的解决方案.本文先是会简单说明对比大部分方 ...
- LVM快照(snapshot)备份
转载自:http://wenku.baidu.com/link?url=cbioiMKsfrxlzrJmoUMaztbrTelkE0FQ8F9qUHX7sa9va-BkkL4amvzCCAKg2hBv ...
- 6/14 sprint2 看板和燃尽图的更新
看板: 燃尽图: 例会照: 总结:因为最近刚好碰上端午假期,再加上程序出了点问题,所以导致进度有点慢, 但是我们还是很努力地在找资料把问题给解决了,虽然完成的情况有点不如人意, 但是我们付出的努力还是 ...
- Unity3D读取模型文件自动生成AnimatorController简单实例
前几天接到一个任务,做一个导入.控制模型动画的工具类,没有太具体的要求,于是就自行思考实际需求,最终根据宣雨松老师的一篇博客,自己规范了一下写了一个工具类.相关工具代码及测试用例已上传至Github. ...
- windows的host文件的位置和作用
在Window系统中有个Hosts文件(没有后缀名),在Windows98系统下该文件在Windows目录,在Windows2000/XP系统中位于C:\Winnt\System32\Drivers\ ...
- TortoiseSVN中出现的图标问题及解决方法
1.红色感叹号表示这个文件从服务器上下载下来以后,在本地被修改过.这时执行提交操作就可以了.2.黄色感叹号表示这个文件在提交的时候发现存在冲突,也就是说有别人在你提交之前对这个文件的同一个版本进行了修 ...
- C# 实现WinForm窗口最小化到系统托盘代码,并且判断左右鼠标的事件
1.设置WinForm窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标. 3.添加窗体最小 ...
- XMLHelper.cs
http://yunpan.cn/Q7czcYTwE8qkc 提取码 545c using System; using System.Linq; using System.Xml.Linq; usi ...