C++动态绑定,也就是在一个点上会发生~~~~~~~~~~~

这个点就是:

p->f();

看上面的函数:

当p去寻找f()的时候,

发现f()是虚函数,

这个时候:

p开始进行自我反省,它发现了所指向的对象的类型后,调用相关的实现。

把p强制转换为派生类的this,然后传给这个函数!

整个过程p本身没有发生类型转换,只是说:

把自己作为了派生类的指针传给了隐藏的this形参;

总结如下:

1.      c++是强类型语言,不去转换类型,它就永远不会自动转换。

2.      转换发生在对函数的参数传递过程中,我们无法控制。

有两个东西可以控制强制类型转换:

typeid

dynamic_cast

这两个东西被称为C++运行时:

对于带虚函数的类来说:

动态绑定发生在运行时期,

而typeid和dynamic_cast;目的是获取对象的实际类型和转换类型,因此也发生在运行时期。

例如:

class A{

f();

}

class B:A{

g();

}

A* pA=new B();

if(B* p=dynamic_cast<B*>(pA))

p.g();

else

throw new dynamic_cast error();

#include <cstdlib>
#include <iostream>
using namespace std;
class A{
};
class B:public A{
public :
void  f(){
cout<<"Hello!"<<endl;
}
};
int main(int argc, char *argv[])
{
A *pA;
((B*)pA)->f();
system("PAUSE");
return EXIT_SUCCESS;
}

对于上面的代码我想说的是:如果感觉强制转换很无奈!~~~~那么可以把这些强制转换进行封装:

经过测试下面的代码,没有任何输出:

#include <cstdlib>
#include <iostream>
using namespace std;
class A{
friend class C;
};
class B:public A{
friend class C;
public :
void  f(){
cout<<"Hello!"<<endl;
}
};
class C{
A* pa;
public:
C(A* p_a):pa(p_a){
};
void f(){
if(typeid(B).name()==typeid(*pa).name())
((B*)pa)->f();
else {
}
}
};
int main(int argc, char *argv[])
{
C c(new B());
c.f();
system("PAUSE");
return EXIT_SUCCESS;
}

现在在A里面添加虚函数:

#include <cstdlib>
#include <iostream>
using namespace std;
class A{
enum _NOINITMYA{a,b};
private:
virtual void myf(_NOINITMYA b1=b){};
friend class C;
};
class B:public A{
friend class C;
public :
void  f(){
cout<<"Hello!"<<endl;
}
};
class C{
A* pa;
public:
C(A* p_a):pa(p_a){
};
void f(){
if(typeid(B).name()==typeid(*pa).name())
((B*)pa)->f();
else {
}
}
};
int main(int argc, char *argv[])
{
C c(new B());
c.f();
system("PAUSE");
return EXIT_SUCCESS;
}

从上面可以看到。c.f()有了结果。传递的参数实际类型为A,那么就会有如下结果:

#include <cstdlib>
#include <iostream>
using namespace std;
class A{
enum _NOINITMYA{a,b};
private:
virtual void myf(_NOINITMYA b1=b){};
friend class C;
};
class B:public A{
friend class C;
public :
void  f(){
cout<<"Hello!"<<endl;
}
};
class C{
A* pa;
public:
C(A* p_a):pa(p_a){
};
void f(){
if(typeid(B).name()==typeid(*pa).name())
((B*)pa)->f();
else {
          // throw new DYNAMIC_CAST_ERROR();
}
}
};
int main(int argc, char *argv[])
{
C c(new B());
c.f();
C c1(new A());
c1.f();
system("PAUSE");
return EXIT_SUCCESS;
}

上面的代码中,c1.f()无结果。其实这是一个错误,直接throw一个类型转换的错误。

动态绑定与继承:不得不去想细节相关推荐

  1. 院士谈如何做好研究生:要逼着自己去想问题,最大的浪费是聪明人不思考

    来源:中国科学报.中国科学院大学.百度百科 本文仅用于学术分享,转载请注明出处.若有侵权,请联系删除或修改! 临近开学季,不少导师也陷入了焦虑,那么作为研究生,该如何利用好新学期在科研上做出成绩呢?今 ...

  2. 袁亚湘院士谈如何做好研究生:要逼着自己去想问题,最大的浪费是聪明人不思考...

    袁亚湘院士简介:在英国剑桥大学读完博士且留校做了几年研究后,1988年在他科研事业蒸蒸日上之时,选择从英国回国,入职中国科学院数学与系统科学研究院,成为了当时中科院最年轻的正研.2011年12月,袁亚 ...

  3. 活在当下,何必去想过去和将来

    读到链接中的文章http://meiwenrishang.com/post/2011-12-07/7562774,让我再次地相信我们应该活在当下,而不去想太多的过去和将来.过去的已经过去,将来的我们无 ...

  4. 现在不是去想缺少什么的时候,该想一想凭现有的东西你能做什么。

    现在不是去想缺少什么的时候,该想一想凭现有的东西你能做什么. --<老人与海> 写这篇文章,有两个两个诱因,一个是 Tinyfool的tiny4cocoa 有一篇文章,正好聊到这个话题,勾 ...

  5. 我不去想,是否能够成功。既然选择了远方,便只顾风雨兼程。

    我们可以欺瞒别人 却无法欺瞒自己 当我们走向枝繁叶茂的五月 青春就不再是一个谜 向上的路 总是坎坷又崎岖 要永远保持最初的浪漫 真是不容易 有人悲哀 有人欣喜 当我们跨越了一座高山 也就跨越了一个真实 ...

  6. c++之继承【把控细节】

    前言 我们知道C++语言是一门面向对象编程的语言,而面向对象编程有三大特性,它们分别是:封装,继承,多态.本文将介绍面向对象编程的另一大特性:继承.学习继承之前,由题目可知细节是非常多的.继承与多态的 ...

  7. 我去过细节印象最深的酒店

    在邯郸,燕赵商务酒店应该是当地的品牌,刚去之前,一直担心太差,去了之后,才发现这是我目前为止住过酒店细节做的最好的一个. 首先看大门,logo也不错,很有国际范 刚刚进入,会发现他们的收银台上面有一个 ...

  8. 雷军北大15分钟演讲:我至少有胆量去想

    原文出处:http://blog.csdn.net/chenleixing/article/details/43192373 大家好,非常感谢在"一刻演讲"跟大家交流,这么一个大的 ...

  9. 雷军北大15分钟演讲:我至少有胆量去想(转)

    大家好,非常感谢在"一刻演讲"跟大家交流,这么一个大的话题.昨天我在乌镇参加了全球互联网峰会,在这个会议上有马云,也有苹果公司的高级副总裁,主持人抛出了一个问题,说雷军你说你有一个 ...

最新文章

  1. 三维点云对应关系聚合算法的性能评价
  2. rabbitmy实战
  3. React Mixins入门指南
  4. 一个suse11 sp1的crash工具版本问题
  5. 类型与通用语言运行时
  6. CentOS 7下配置IP地址
  7. 图像处理结果的度量 —— SNR、PSNR、SSIM
  8. 大数据技术原理与应用:期末考点总结
  9. 卡巴斯基终于也免费了:功能太鸡肋
  10. 概率统计13——二项分布与多项分布
  11. 美联储印钞,中国物价为何上涨?
  12. 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。【需要修改】
  13. 让创意设计更加简单:在线设计平台Canva登陆中国
  14. Android性能优化方案
  15. IDEA 2018.3.3 有效期至 2100
  16. 【20210910】【机器/深度学习】lightGBM模型训练中报错:“Cannot set reference after freed raw data“
  17. Flutter面试总结(2022)
  18. Memory基本debug指令与基础知识(一)
  19. win10蓝牙断断续续问题
  20. JAVA社招,让老板心动的简历原来是这样

热门文章

  1. js 将二进制流html导出excel,js 实现纯前端将数据导出excel
  2. python reader循环_python – 多次循环遍历csv.DictReader行
  3. mysql ios 工具_IOS工具(三)安装mysql
  4. python psycopg2_Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)
  5. 在标签使用onclick(this)来传递参数
  6. Vue计算属性和监听属性
  7. 访客门禁系统供应商 首选钱林厂家
  8. Scrapy研究和探索(七)——如何防止被ban大集合策略
  9. Start Developing iOS Apps Today系列(十二)
  10. WCF错误:413 Request Entity Too Large