博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[条款36]绝不重新定义继承而来的non-virtual函数
阅读量:6196 次
发布时间:2019-06-21

本文共 691 字,大约阅读时间需要 2 分钟。

  看下面的两个类的声明代码:

class B{public:	void mf();	//something to do};class D : public B{public:	void mf();};

  如果有下面的调用:

D x;//第一种调用B *pB = &x;pB->mf();//调用B::mf//第二种调用D *pD = &x;pD->mf();//调用D::mf

  这两种调用的行为是不一样的,虽然从表面上看,两者都是通过对象x调用成员函数mf,凭借相同的对象。但是怎么就调用到了不同的函数呢。

造成这一两面性的原因是non-virtual函数都是静态绑定的。意思是,由于PB被声明为一个pointer-to-B,通过PB调用的non-virtual函数永远是B所定义的版本,即使PB指向了一个类型为“B派生的子类”

提示:

但是另一方面,virtual函数是动态绑定的,如果mf是一个virtual函数,不论是通过pB或者pD调用mf,都会导致调用D:mf,因为pB和pD真正指向的都是一个类型为D的对象。

所以问题就来了,如果在编程的时候,在class D中重新定义了继承自class B的non-virtual函数mf,D对象就可能展现出精神分裂的不一致行为。也就是说,当mf被调用的时候,任何一个D对象都可能表现出B或者D的行为。决定因素不在对象自身,而在于“指向该对象的指针”当初声明的类型。

提示:

References也会展现和指针难以理解的行径。

 

转载于:https://www.cnblogs.com/stemon/p/4445464.html

你可能感兴趣的文章
js自定义方法名字download报错
查看>>
[BZOJ] 4806 炮
查看>>
[BZOJ] 1877: [SDOI2009]晨跑
查看>>
Assess数据库第十三周总结
查看>>
eclipse 创建maven 项目 动态web工程完整示例 maven 整合springmvc整合mybatis
查看>>
Drozer
查看>>
【SQLSERVER】如何找出字符串中的数字
查看>>
vue-cli(vue脚手架)
查看>>
【翻译】Longest Palindromic Substring 最长回文子串
查看>>
BZOJ 1369 树形DP
查看>>
Web - Html
查看>>
Javascript Regexp match and replace
查看>>
oracle 数据库备份 手工备份
查看>>
移动端开发的一些技巧总结(1)
查看>>
CODING 代码托管架构升级之路
查看>>
并发系列6-Java并发面试系列文章总结【石杉的架构笔记】
查看>>
MySQL中有关TIMESTAMP和DATETIME的总结
查看>>
SpringBoot之HandlerInterceptor拦截器的使用 ——(三)获取requestBody解决java.io.IOException: Stream closed...
查看>>
分块+二分 BZOJ 3343
查看>>
bzoj4842 Delight for a Cat
查看>>