C++ virtual关键词理解

多态 (待续) 虚函数 C++中的虚函数的实现一般是通过虚函数表(C++规范并没有规定具体用哪种方法,但大部分的编译器厂商都选择此方法)。 类的虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址。 注意的是,编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4字节的大小。 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其真实反应实际的函数。这样,在有虚函数的类的实例中分配了指向这个表的指针的内存,所以,当用父类的指针来操作一个子类的时候,这张虚函数表就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。 编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。 这意味着可以通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。 (引用: http://www.baike.com/wiki/%E8%99%9A%E5%87%BD%E6%95%B0%E8%A1%A8 ) 纯虚函数 (待续) 例子 (待续) 虚函数的重要规则 如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的。 只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。 静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。 内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义,但是在编译的时候系统仍然将它看做是非内联的。 构造函数不能是虚函数,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。 析构函数可以是虚函数,而且通常声名为虚函数。 菱形继承(虚基类) (待续) 析构函数 根据上述规则6,具有多态特性的类的析构函数,有必要声明为virtual。如下实例,如果析构函数不用virtual修饰,无法调用子类的析构函数:

输出结果:

如果析构函数不用virtual修饰,则输出结果:

The “HoeflerText” font wasn’t found——解决方法

打开网站时提示The “HoeflerText” Font Wasn’t Found,很像浏览器提示的错误,用户容易去点击“Update”(如下图),实际是网站被植入了攻击代码。详细攻击原理见:https://www.pcrisk.com/removal-guides/11048-the-hoeflertext-font-wasnt-found-scam 解决方法 我遇到的这种攻击,植入代码很简单,是Wordpress的主题index.php第一行被植入了攻击代码,会生成对应的js代码。直接删掉就行。 为什么直接写到php文件了?原因也很简单,文件权限被设为了777。这是不少开发者为了图简单,对apache的配置也不熟悉,就一开始简单的把权限设为777,后来忘了。 这类代码植入是否有其它手段?有空再琢磨。

C++空指针调用成员函数

先看代码

输出结果: I’m in normal_func Segmentation fault 分析 就是“静态绑定”和“动态绑定”的问题。 参考: https://www.zhihu.com/question/23260677

技术大牛推荐加强软件开发基础的文章和书

跟大牛沟通交流加强软件开发基础,给了如下建议: 推荐研读的书: 《tcp/ip详解》、《计算机体系结构》 推荐的文章: http://fex.baidu.com/blog/2014/05/what-happen ,搞清楚这个流程里的主要问题 总结 (待续)

WordPress的Markdown编辑器

Markdown是一种轻量级标记语言。Github的README就是用这个,越来越流行,确实很方便。Wordpress上也有相应的编辑器。 WP Markdown Editor 本文由此插件编辑所得,其中代码部分由Crayon Syntax Highlighter插件生成。 标题1 标题2 标题3 一串斜着的字 黑色 白色 红色 C/C++ Java Python

Javascript代码编译:压缩和混淆

Google closure 下载Closure编译的jar包 下载Closure Compiler(下载不了的自行想办法哈,需要梯子,你懂的) 创建js文件 如命名为hello.js

编译js文件 编译:

编译后的代码:

参考: https://developers.google.com/closure/ https://developers.google.com/closure/compiler/docs/gettingstarted_app 其它类似工具 Uglfyjs YUI Compressor

基于Play Framework和Semantic-UI的用户登录和注册实现(play-java-loginner)

play-java-loginner是基础性模块,主要实现用户登录和注册实现,网站可基于此直接开发。代码见github,便于将持续维护和完善。 Play Framework,相比Spring MVC,个人比较喜欢这个框架。 Semantic-UI,用过Bootstrap,这个相比元素丰富得多。 Apache Shiro,安全框架 Ebean,ORM

HTTP的幂等性

有叫编程中的幂等性,REST的幂等性,或分布式系统接口幂等性,应该都是一个意思。 参考: http://www.i3geek.com/archives/841 http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html http://blog.brucefeng.info/post/api-idempotent http://www.infoq.com/cn/news/2013/05/idempotent

C++的四种cast类型转换操作符

const_cast(expression) dynamic_cast(expression) reinterpret_cast(expression) static_cast(expression) (待续) 参考: http://www.cnblogs.com/welfare/articles/336091.html http://www.tutorialspoint.com/cplusplus/cpp_casting_operators.htm

C++11——auto的用法

C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念。 1.自动类型推断 auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作。下面是一些使用auto的例子。

2.返回值占位

3.使用注意事项 (1).我们可以使用valatile,pointer(*),reference(&),rvalue reference(&&) 来修饰auto

(2).用auto声明的变量必须初始化

(3).auto不能与其他类型组合连用

(4).函数和模板参数不能被声明为auto

(5).定义在堆上的变量,使用了auto的表达式必须被初始化

(6).以为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid

(7).定义在一个auto序列的变量必须始终推导成同一类型

(8).auto不能自动推导成CV-qualifiers(constant & volatile qualifiers),除非被声明为引用类型

(9).auto会退化成指向数组的指针,除非被声明为引用

转载:http://blog.csdn.net/huang_xw/article/details/8760403