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++中类的多态与虚函数的使用 类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持 ...
随机推荐
- python常用数据类型内置方法介绍
熟练掌握python常用数据类型内置方法是每个初学者必须具备的内功. 下面介绍了python常用的集中数据类型及其方法,点开源代码,其中对主要方法都进行了中文注释. 一.整型 a = 100 a.xx ...
- .NET VS2012 将代码同步上传到 oschina.net 和 github
1.先首要注册两个账号 https://github.com/ http://git.oschina.net/ 2.下载 getextendions http://sourceforge.net/pr ...
- angular设置title
Javascript框架在处理seo方面存在问题,因为爬虫在检索seo信息的时候会读不了js给其赋的值,导致搜索引擎收录不了或者收录了无效的信息,比如收录的可能是title={{title}}这样的, ...
- shell join 参数详细说明
join类似db里面的join方法,同样有left join right join inner join等 指定参数-a 可以指定join的方式. -a1表示显示第一个文件中不匹配的行,即为left ...
- Week4 结对编程
1.照片 1.1 结对编程参与者:李文涛.黎柏文 1.2 展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...
- VC使用libcurl模拟登录CSDN并自动评论资源以获取积分
环境:Win7 64位+VC2008 软件及源码下载:(http://pan.baidu.com/s/1jGE52pK) 涉及到的知识点: C++多线程编程 libcurl的使用(包括发送http请求 ...
- oracle触发器类型
http://www.cnblogs.com/roucheng/p/3506033.html 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异 ...
- js定时器调用参数的方法
var userName="Tony"; //根据用户名显示欢迎信息 function ss(_name){ alert("ss,"+_name); } 使用字 ...
- 重新想象 Windows 8.1 Store Apps (88) - 通信的新特性: 新的 HttpClient
[源码下载] 重新想象 Windows 8.1 Store Apps (88) - 通信的新特性: 新的 HttpClient 作者:webabcd 介绍重新想象 Windows 8.1 Store ...
- csharp:百度语音识别
public string API_id = "8888"; //你的ID public string API_record = null; public string API_r ...