C++中的动态类型与动态绑定、虚函数、运行时多态的实现
动态类型与静态类型
静态类型
是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变。通俗的讲,就是上下文无关,在编译时就可以确定其类型。
动态类型
是指由一个左值表达式表示的左值所引用的最终派生对象的类型。例:如果一个静态类型为“类 B ”的指针p 指向一个继承于 B的类 D 的对象,则表达式 *p 的动态类型为“D”。引用按照相似规则处理。一般地讲,基类的指针和基类引用有可能为动态类型,就是说在运行之前不能够确定其真实类型。通常我们说,“基类指针指向的对象的实际/真正类型”或“基类引用所引用的对象的实际/真正类型”,就是它们的动态类型。很显然,这个动态类型是 C++ 语言通过指针和引用实现运行时多态能力的核心概念。
动态绑定与静态绑定
class Base {
public:
void func() {
cout << "func() in Base." << endl;
}
virtual void test() {
cout << "test() in Base." << endl;
}
}; class Derived : public Base {
void func() {
cout << "func() in Derived." << endl;
}
virtual void test() {
cout << "test() in Derived." << endl;
}
}; int main() {
Base* b;
b = new Derived();
b->func();
b->test();
}


虚函数、动态绑定、运行时多态之间的关系
动态绑定,需满足两个条件:
动态绑定,从而来
运行时
实现多态的。
class Base {
public:
void Print() {
cout << "Print() from Base." << endl;
} virtual void Display() {
cout << "Display() from Base." << endl;
}
}; class Derived1 : public Base {
public: void Print() {
cout << "Print() from Derived1." << endl;
} void Display() {
cout << "Display() from Derived2." << endl;
}
}; class Derived2 : public Base {
public:
void Print() {
cout << "Print() from Derived2." << endl;
} void Display() {
cout << "Display() from Derived2." << endl;
}
}; class Derived3 : public Base {
public:
void Print() {
cout << "Print() from Derived3." << endl;
} void Display() {
cout << "Display() from Derived3." << endl;
}
};
//通过基类引用作形参实现多态
void Polymorphic1(Base& b) {
b.Print();
b.Display();
} //通过基类指针作形参实现多态
void Polymorphic2(Base* b) {
b->Print();
b->Display();
}
下面是测试代码:
int main() {
Base b;
Derived1 d1;
Derived2 d2;
Derived3 d3; vector<Base> base_vec;
base_vec.push_back(b);
base_vec.push_back(d1);
base_vec.push_back(d2);
base_vec.push_back(d3); vector<Base*> base_ptr_vec;
base_ptr_vec.push_back(&b);
base_ptr_vec.push_back(&d1);
base_ptr_vec.push_back(&d2);
base_ptr_vec.push_back(&d3); cout << endl << "对通过基类引用作形参实现多态进行测试" << endl;
//对通过基类引用作形参实现多态进行测试 (测试方式错误)
for (int i = 0; i != base_vec.size(); ++i) {
Polymorphic1(base_vec[i]);
} cout << endl << "对通过基类指针作形参实现多态进行测试" << endl;
//对通过基类指针作形参实现多态进行测试
for (int i = 0; i != base_vec.size(); ++i) {
Polymorphic2(base_ptr_vec[i]);
} cout << endl << "对通过基类引用作形参实现多态进行测试" << endl;
//对通过基类引用作形参实现多态进行测试
Polymorphic1(b);
Polymorphic1(d1);
Polymorphic1(d2);
Polymorphic1(d3); return 0;
}
测试结果如下图:

由C++ STL的vector容器中存储的对象拷贝引起的对capacity属性 的理解
参考文献:
C++中的动态类型与动态绑定、虚函数、运行时多态的实现的更多相关文章
- Objective-C路成魔【11-多态性、动态类型和动态绑定】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 多态这个其 ...
- Python中高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件。
https://github.com/jhao104/proxy_pool/blob/master/doc/introduce.md 3.代码模块 Python中高层次的数据结构,动态类型和动态绑定, ...
- 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?
转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...
- C# 中的动态类型
翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...
- C++ //多态 //静态多态:函数重载 和 运算符重载 属于静态多态 ,复用函数名 //动态多态:派生类和虚函数实现运行时多态
1 //多态 2 //静态多态:函数重载 和 运算符重载 属于静态多态 ,复用函数名 3 //动态多态:派生类和虚函数实现运行时多态 4 5 //静态多态和动态多态的区别 6 //静态多态的函数地址早 ...
- JavaScript中两种类型的全局对象/函数【转】
Snandy Stop, thinking is the essence of progress. JavaScript中两种类型的全局对象/函数 这里所说的JavaScript指浏览器环境中的包括宿 ...
- 深入浅出OOP(三): 多态和继承(动态绑定/运行时多态)
在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 运行时多态或迟绑定.动态绑定 在C#语音中,运行时 ...
- iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...
- OC基础6:多态、动态类型和动态绑定
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于SEL类型的数据: (1).SEL ...
随机推荐
- httrack,webdup,WinHTTrack,WebZip
怎么下载摄像头游戏jabbo,并使其能离线运行?修改 1.摄像头游戏jabbo:JABBO Ultimatum by LiveMurals Interactive电脑为:windows 7 32位.试 ...
- 一个C#多线程的工作队列
多线程添加元素到队列中,队列根据绑定 的事件进行自动处理,可以设置WorkSequential属性来实现对队列处理的单线程(严格顺序处理)或者多线程处理(循序出队,但是 多线程处理,不保证对队列元素的 ...
- apache FtpServer 整合spring部署
我们在项目中可能会出现这样的需求,使用ftp上传很大的文件后对需要对文件进行相应的逻辑处理,这时我们可以使用apache ftpServer来处理这段逻辑,只要我们做相应的部署和编写我们的逻辑代码,这 ...
- PCRE-正则库及用法
摘自http://blog.chinaunix.net/uid-26575352-id-3517146.html 在C语言中利用PCRE实现正则表达式 http://www.pcre.org/ ...
- 采用标准c进行目录文件遍历
图像处理的时候经常需要对一个目录的所有图像进行处理,遍历文件得c代码: 在windows中需要使用到宽字符. 另外,可以使用opencv封装的目录访问操作,下次给出. // DirTraverse.c ...
- UVA10199- Tourist Guide(割点)
题目链接 题意: 给出一张无向图,找出割点,字典序输出割点的名字. 思路:简单的割点的求解,用map映射.easy输出. 代码: #include <iostream> #include ...
- COJ 1059 - Numeric Parity 位操作
非常好玩的一道题.能够熟悉下位操作实现和玩一玩bitset这个容器 Description We define the parity of an integer N as the sum of the ...
- Java String类具体解释
Java String类具体解释 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,非常多时候,我们对它既熟悉又陌生. 类结构: public fin ...
- 【巧妙预处理系列】【UVA1330】City game
最大子矩阵(City Game, SEERC 2004, LA 3029) 给定一个m×n的矩阵,其中一些格子是空地(F),其他是障碍(R).找出一个全部由F组成的面积最大的子矩阵,输出其面积乘以3后 ...
- java学习之部分笔记2
1.变量 实例变量和局部变量 实例变量系统会自动初始化为0和null(string),局部变量必须设定初始值. 静态方法里只能引用静态变量 数据类型的自动转换! int—>long 2.构造方法 ...