c++的动态绑定和静态绑定
为了支持c++的多态性,才用了动态绑定和静态绑定。
1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。
2、对象的动态类型:目前所指对象的声明。在运行期决定。对象的动态类型可以更改,但是静态类型无法更改。
关于对象的静态类型和动态类型,看一个示例:
class A{};
class B: public A{};
class C: public A{}; int main()
{
C *pc=new C();//pc的静态类型是它声明的类型C*,动态类型也是C*
A *pa=pc;//pa的静态类型是它声明的类型A*,pa的动态类型所指向的对象pc的类型A*
B *pb=new B();
pa=pb;//pa的动态类型是可以更改的,现在它的动态类型是B*
return ;
}
3、静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。
4、动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。
class A
{
public:
void dosomething()
{
cout<<"A"<<endl;
} virtual void fun()
{
cout<<"virtual A"<<endl;
}
};
class B: public A
{
public:
void dosomething()
{
cout<<"B"<<endl;
} virtual void fun()
{
cout<<"virtual B"<<endl;
}
};
class C: public A
{
public:
void dosomething()
{
cout<<"C"<<endl;
} virtual void fun()
{
cout<<"virtual C"<<endl;
}
}; int main()
{
C *pc=new C();//pc的静态类型是它声明的类型C*,动态类型也是C*
pc->dosomething(); // C
pc->fun(); // virtual C
A *pa=pc;//pa的静态类型是它声明的类型A*,pa的动态类型所指向的对象pc的类型A*
pa->dosomething(); // A ①
pa->fun(); // virtual C
B *pb=new B();
pb->dosomething(); //B
pb->fun(); // virtual B
pa=pb;//pa的动态类型是可以更改的,现在它的动态类型是B*
pa->dosomething(); // A ②
pa->fun(); // virtual B
return ;
}
dosomething()是一个非虚函数,它是静态绑定的,也就是在编译的时候根据对象的静态类型来选择函数,所以,pa、pb、pc调用的都是自己的的dosomething()函数,但对于①中的pa的fun()函数和②中的pa的fun()函数,因为fun()为虚函数,它们绑定的是动态对象,所以①的pa调用的是pc的fun()函数,②的pa调用的是pb的fun()函数。
需要注意的是:
当缺省参数和虚函数一起出现的时候情况就有点复杂,因为虚函数是动态绑定的,但是为了执行效率,缺省参数是静态绑定的。
class A
{
public:
virtual void fun(int i=)
{
cout<<"virtual A "<<i<<endl;
}
};
class B: public A
{
public:
virtual void fun(int i=)
{
cout<<"virtual B "<<i<<endl;
}
}; int main()
{
B *b=new B();
A *a=b;
b->fun();//virtual B 20
a->fun();//virtual B 10
return ;
}
b->fun()、a->fun()调用的都是b的fun()函数,但是缺省函数是静态绑定的,所以a->fun()调用的是a的虚函数fun()里面的缺省值10,b->fun()调用的是b的虚函数fun()里面的缺省值20。
只有涉及虚函数的地方才存在动态绑定!!!!
参考博客:https://blog.csdn.net/chgaowei/article/details/6427731
c++的动态绑定和静态绑定的更多相关文章
- 深入理解C++的动态绑定和静态绑定【转】
转自:http://blog.csdn.net/chgaowei/article/details/6427731 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性 ...
- c++动态绑定与静态绑定
C++为了支持多态性,采用了动态绑定和静态绑定 相关概念: 对象的静态类型:对象在声明时采用的类型,编译时确定 对象的动态类型:目前所指对象的类型,在运行时确定 class B { } class C ...
- 再次探讨C++的动态绑定和静态绑定
以前在学习C++的时候,对动态绑定和静态绑定的理解是:静态绑定是编译时决定的,非虚函数基本都是静态绑定:而动态绑定用于虚函数,是为了实现多态.这样理解没什么大的问题,但我一直疑惑的是,既然静态绑定可以 ...
- 关于继承的基本知识,方法重写,final和abstract的使用, 动态绑定和静态绑定的知识
一.继承: 涉及关键字: extends(继承) super final abstract 特点: 1.类与类之间可以用 XX是XX来描述 , 那么他们之间就存在继承关系. 2.Java中不支持多继 ...
- 【转】深入理解C++的动态绑定和静态绑定 & 不要重定义虚函数中的默认参数
为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误.需要理解四个名词:1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的.2 ...
- C++ 多态Polymorphism 介绍+动态绑定、静态绑定
什么是多态? 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是一种物质的多种形态. 在专业术语中,多态是一种运行时绑定机制(run-time binding) ,通过 ...
- 深入理解C++的动态绑定和静态绑定
转自:http://blog.csdn.net/chgaowei/article/details/6427731 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性 ...
- c++的动态绑定和静态绑定及多态的实现原理(摘)
C++多态的实现原理 为了支持c++的多态性,才用了动态绑定和静态绑定.理解它们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误. 需要理解四个名词:对象的静态类型:对象在声明时采用的类型. ...
- Java动态绑定和静态绑定-多态
一.问题 Java方法调用过程中,Jvm是如何知道调用的是哪个类的方法?Jvm又是如何处理? 二.概念 a.当子类和父类(接口和实现类)存在同一个方法时,子类重写父类(接口)方法时,程序在运行时调 ...
随机推荐
- goole Advance client 离线安装
1.下载插件:Advanced Rest Client 2.最新版的Chrome不支持本地安装插件,所以我们要使能开发者模式 3.把插件后缀名crx改为zip 4.解压,点击‘加载正在开发的扩展程序’ ...
- servlet 解决乱码问题
对于servlet大家应该都很熟悉了,今天再复习一下,如果有哪里写的不好或不对的地点希望广大的网友批评指正.今天只讨论get和post两w种方式,他们之间有很多的不同点,所以解决编码的方式也会不一样, ...
- (转载)Fiddler调式使用知多少(一)深入研究
原文来源于:http://www.cnblogs.com/tugenhua0707/p/4623317.html,作者:涂根华 !个人觉得原作者写的特别好,故收藏于此 Fiddler调式使用(一)深入 ...
- java通过sftp对linux服务器文件夹进行操作
本文主要讲sftp对linux服务器的文件和文件夹进行操作,windows server 服务器不支持. package com.lx.ftp; import java.io.File; import ...
- js 构建map 和list
//构建map function Map() { this.arr = new Array(); var struct = function(key, value) { this.key = key; ...
- 20171123IdleHandler
在Android中,我们可以处理Message,这个Message我们可以立即执行也可以delay 一定时间执行.Handler线程在执行完所有的Message消息,它会wait,进行阻塞,知道有心的 ...
- (转)EntityFramework.Extensions
转自:http://www.symbolsource.org/Public/Metadata/NuGet/Project/EntityFramework.Extended/1.0.0.20/Relea ...
- 第一章javascript词法结构笔记摘要
语法介绍 javascript最流行的脚本语言,用于web和HTML,服务器.pc.移动端 轻量级语言,可以插入HTML页面,由浏览器按编写顺序执行 一.字符集 用Unicode字符集编写,是ASCI ...
- 堆操作,malloc
PS:堆空间缺省值都是cd,栈空间缺省值都是cc 内存有四区:栈.全局(静态).常量.除此以外的空间暂时不能随意使用,但是通过malloc函数申请就可以使用了. 利用malloc申请一个int变量,注 ...
- hdu 4925 黑白格
http://acm.hdu.edu.cn/showproblem.php?pid=4925 给定一个N*M的网格,对于每个格子可以选择种树和施肥,默认一个苹果树收获1个苹果,在一个位置施肥的话,周围 ...