用户操作
[即时聊天] [发私信] [加为好友]
董士崇ID:houdy
64068次访问,排名1638好友0人,关注者6
houdy的文章
原创 48 篇
翻译 0 篇
转载 0 篇
评论 48 篇
A programming bug的公告
我的邮箱: shichongdong80@gmail.com
最近评论
kingsun555:给虚表指针赋值是编译器偷偷完成的,具体的时机是在进入到虚函数后,在给对象的数据成员初始化和赋值之前,编译器偷偷的给虚表指针赋值。

=========================
此处有个问题,“具体的时机是在进入构造函数”而不是虚函数!
jeckbjy:其实就是优先级问题:我经过测试,以下是我的测试代码:
#include "stdafx.h"
#include"iostream.h"

void UpToLow(char *szWord)
{
for (char *piterator = szWord; *piterator != 0; pite……
blackdrong:朋友,有没有关于glew函数库,每个函数的介绍?这样的资料,我的油箱blackdrong@163.com,谢了
dnaiel_zeng:好资料啊,我现在在做机器视觉,正好发现了opencv,以后有不懂的还得向前辈请教咯!
houdy:To xuege:
你的方法也不错:). 如果需要"吹毛求疵"的话,你的方法需要(N+M)次遍历,而转化成判断是否存在环的问题,在极端情况下只需要N或者M次,是前者的一半:).
文章分类
收藏
    相册
    ----<我的链接>----
    lijgame的专栏
    寒星轩
    小静静的虫子
    禾青谷
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Inside COM Object Model收藏

    新一篇: 一次有意义的面向对象设计尝试 | 旧一篇: Segment/Section/Virtual Memory/Page之间的区别

    前言
    C++对象模型经常会受到大家的关注,这个可以从论坛中大量的和C++对象模型有关的帖子就可以看出来,但是我却很少看到讨论COM组件模型的讨论和文章。我现在正在作一些和COM有关的工作,对这个问题也比较感兴趣,我就想自己写一篇关于这个主题的文章。本文的名字是借用一本非常著名的书的名字,那就是<Inside C++ Object Model>。选择这个名字是不是有借助<Inside C++ Object Model>这本书的名气"炒作"自己的嫌疑?呵呵,可能有一点吧。但是这决不是我使用这个名字的真真原因。在通常情况下我们是用C++来编写COM组件,所以我们可以认为COM组件是一种特殊的C++ 对象,如果把所有的C++对象看作是一个集合的话,那COM组件应该是这个集合的一个子集。鉴于COM组件和C++ 对象之间紧密的关系,我选择了这个名字。

    预备知识
    虽然我们使用任何语言来编写COM组件,只要我们编写的COM组件符合COM规范,但是在大多数情况下我们仍然是采用C++来编写COM组件,而且我们还会使用ATL库来大大简化我们的工作。所以读者在阅读之间,最好有一定的C++/ATL的基础。

    COM组件对象
    从本质上来说,我们设计COM组件的过程就是设计C++类的过程。相对于普通的C++类,COM组件的设计有一些常见的形式:
    1. COM组件通常采用多继承的方式来设计类。
    2. COM组件的基类通常情况下应该是一些接口类(以"IXXX"形式存在)和一些实现了某些接口的接口实现类 (以"IXXXImpl"形式存在)。从C++实现的角度来看,接口类就是"抽象基类",而接口实现类则是普通的C++类。接口类通常情况下没有数据成员,而接口实现类则允许有数据成员。
    3. COM组件的基类也可以是一些普通的C++类。这种情况并不常见。

    无论COM组件在实现的形式上是如何错综复杂,COM组件最重要的工作就是实现接口并向客户端暴露这些接口。接口的实现可以是直接继承自某个接口并在组件中实现,也可以是通过继承某个类来获得对接口的实现。这些对COM组件的模型有什么影响?我们知道,接口实际上就是仅包含一个虚表指针的C++类,这样接口对COM组件的贡献实际上就是物理内存分布中的一个虚表指针。对于普通的接口类(通常以"IXXX"形式存在),它们的虚函数并没有被实现,所以它们的虚表中存放的并不是虚函数的实际地址,在VS编译器存放的是一个由编译器实现的"存根函数"地址,当试图通过虚表找到这个函数并且执行这个函数的时候会抛出异常。对于实现了接口函数的接口实现类(通常以"IXXXImpl"形式存在),它们的虚表中存放的就是虚函数的实际地址。对于COM组件来说,由于它可以拥有多个接口,它可以拥有多个虚表指针,这些虚表指针可以以任意顺序,任意布局分布在COM组件的模型中。当客户程序在COM组件不同接口之间切换时,即客户程序获取COM组件暴露的接口时,实际上客户程序获取的是接口在COM组件中对应的虚表指针。

    历史记录
    05/12/2007   v1.0
    原文的第一版
    02/05/2008   v1.1
    添加了接口类和接口实现类的虚表内容

    发表于 @ 2007年05月12日 11:27:00|评论(loading...)|编辑

    新一篇: 一次有意义的面向对象设计尝试 | 旧一篇: Segment/Section/Virtual Memory/Page之间的区别

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © A programming bug