time 
设为首页】【收藏本站
当前位置:主页 > TAG标签 > 基础入门



 
2009-11-04 12:40:09 | 好评(0) | 浏览(604)
1接口注入 我们常常借助接口来将调用者与实现者分离。如: public class ClassA { private InterfaceB clzB; public doSomething() { Ojbect obj = Class.forName(Config.BImplementation).newInstance(); clzB = (InterfaceB)obj; clzB.doIt() } …… } 上面的代码中...
 
2009-11-04 12:40:09 | 好评(0) | 浏览(325)
原文地址:http://www.c2.com/cgi/wiki?DoubleBraceInitialization 这是我在JavaIdioms(http://www.c2.com/cgi/wiki?JavaIdioms)上看到一个Java使用技巧。使用Java这么多年了,也还是头一次看到,还很实用。别看这小技巧好像很简单,但保证你不会在任何一书Java教...
 
2009-11-04 12:40:08 | 好评(0) | 浏览(315)
...
 
2009-09-21 00:21:24 | 好评(0) | 浏览(266)
记得刚学C++的时候,喜欢研究API,当时同事有一个高手,写了段代码,我在写程序的时候,莫明妙的,机器突然关掉了!我正在纳闷的时候,我听到了他的奸笑! 原来是他干的,后来我研究了好久InitiateSystemShutdown这个API函数,了解被作弄的原理了,因为我的机器加入了W...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(550)
后记 结合前面的讨论,我们可以看到,只要牵涉到了虚继承,在访问父类的成员变量时生成的代码相当的低效,需要通过很多间接的计算来定位成员变量的地址。在指针类型转换,动态转型,及虚函数调用时,也需要生成很多额外的代码来调整this指针。象前一篇中对C170对象的ob...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(563)
菱形结构的虚继承(3) 最后我们看看,如果在上篇例子的基础上,子类及左、右父类都各自定义了自己的虚函数,这时的情况又会怎样。 struct C140 : public virtual C041 { C140() : c_(0x02) {} virtual void foo() { c_ = 0x11; } char c_; }; struct C160 : public vi...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(306)
菱形结构的虚继承(2) 我们再看一个例子,这个例子的继承结构和上一篇中是一样的,也是菱形结构。不同的是,每一个类都重写了顶层类声明的虚函数。代码如下: struct C041 { C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_; }; struct C140 : publi...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(482)
菱形结构的虚继承 这次我们看看菱形结构的虚继承。虚继承的引入本就是为了解决复杂结构的继承体系问题。上一篇我们在讨论虚继承时用的是一个简单的继承结构,只是为了打个铺垫。 我们先看看这几个类,这是一个典型的菱形继承结构。C100和C101通过虚继承共享同一个父类C...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(494)
普通的虚继承 下面我们来看虚继承。首先看看这C020类,它从C010虚继承: struct C010 { C010() : c_(0x01) {} void foo() { c_ = 0x02; } char c_; }; struct C020 : public virtual C010 { C020() : c_(0x02) {} char c_; }; 运行如下代码,查看对象的内存布局: PRIN...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(437)
构造函数中的虚成员函数调用 在构造函数中调用虚成员函数,虽然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造过程的理解。这个问题也和一般直观上的认识有所差异。先看看下面的两个类定义。 struct C180 { C180() { foo(); this-foo(); } virtual f...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(350)
虚函数调用 我们再看看虚成员函数的调用。类C041中含有虚成员函数,它的定义如下: struct C041 { C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_; }; 执行如下代码: C041 obj; PRINT_DETAIL(C041, obj) PRINT_VTABLE_ITEM(obj, 0, 0) obj.foo(); C...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(496)
普通成员函数的调用 从这部分开始我们除了利用内存的信息打印来进行探索外,更多的会通过跟踪和观察编译器产生的汇编代码来理解编译器对这些语言特性的实现方式。汇编方面知识的讨论超出了本文的范围,我只对和我们讨论相关的汇编代码进行解析。理解本文要讨论的知识并...
 
2009-09-21 00:00:29 | 好评(0) | 浏览(512)
类型动态转换和类型强制转换 为了验证前面提到过的类型动态转换(即dynamic_cast转换),以及对象类型的强制转换。我们利用前面定义的C041、C042及C082类来进行验证。 运行下列代码: c082.C041::c_ = 0x05; PRINT_VTABLE_ITEM(c041, 0, 0) PRINT_DETAIL(C041...
 
2009-09-21 00:00:28 | 好评(0) | 浏览(368)
带虚函数的类的对象布局(2) 接下来我们看看多重继承。定义两个类,各含一个虚函数,及一个数据成员。再从这两个类派生一个空子类。 struct C041 { C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_; }; struct C042 { C042() : c_(0x02) {} virtual...
 
2009-09-21 00:00:28 | 好评(0) | 浏览(620)
前言 本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等。 写这篇文章源于我在论坛上看到的一个贴子。有人问VC使用了哪种方式来实现虚继承。当时我写了一点代码想验证一下,结果发现情况比我想象...
 
最新标签