搞清C++虚继承

c++虚继承平时很少用到,看书的时候也就是理解个大概。
这次实践中使用到了虚继承,总算有了具体的印象。

基类thunk怎么在子类对象里堆叠的,咱就不赘述了,反正网上、教科书上到处都有讲。这次咱自己遇到的问题主要是虚继承和普通多重继承没搞清区别。

我有一套虚接口hierarchy.


class View {
   virtual int ID() = 0;
   virtual int Child() = 0;
};

class TextView : public {
   virtual const char* getText() = 0;
};

此处省去代码数百行。。。

之后当我开始做这套虚接口的一组实现时,才发现问题。


class SysView : public View {
    virtual int ID();
    virtual int Child();
};

到这里还是都正常的。


class SysTextView : public SysView, public TextView
{
     virtual const char* getText();
};

当实现这个类时,就会发现其对象无法实例化。因为View下面的虚接口没有实现。咦,不是继承了SysView而SysView实现了View下面的所有虚接口吗?问题没有这么简单。因为这个是多重继承,每个父类都会在子类中产生一个拷贝,所以SysTextView里面就出现了两个View类型的父对象。一个是SysView,一个是TextView。而TextView没有实现View的虚接口,因此这个类整个就都不能实例化了。

解决方案就是必须使用虚继承,让编译器知道,TextView继承的那个View和SysView继承的那个View,是同一个View。则需要修改的代码如下:


class SysView: virtual public View {
///...
};

class TextView : virtual public View {
///...
};

注意SysTextView并不需要对其两个父类进行虚继承,除非hierarchy下面还有对这个类进行多继承的情况出现。

虚继承会影响系统性能,应尽量避免。这里用到这个逻辑,只是为了能够使用工厂方法较为优美地创建出各种不同类型的对象,然后调用其虚接口完成操作。并不是性能瓶颈。呜长久以来一个知识漏洞终于通过一次实践补上了。挺好。

ifttt fail

土人今天才拿到ifttt的邀请(感谢胡同学)。于是想看看他会不会禁止死循环神马的。。没想到第一层的循环他都接受的。。。

if send any email to trigger@ifttt.com then send a email to trigger@ifttt.com

本来还想弄成什么 if a then b, if b then c, if c then a 之类的欺负他呢。。

当然可能他有机制保证他不至于循环得太快。。或者邮件发多了就变成垃圾邮件自动会被邮件服务器禁止也是有可能的。当然咱是不准备实际去尝试啦,太囧了。。

另,wp 3.2的界面挺漂亮的~可用空间更大了点~

北京出差

好久好久没有写bo了。。
上班以后确实挺累的,回家里就翻在那里,看会动画片,然后睡觉…囧|||

终于因为出差的关系,手上的工作都交接了,反而可以悠闲地打打酱油神马的~
所以,装了个highlight的工具,试试效果哈~


#include <stdio.h>
int main(){
    printf("hello, world\n");
    return 0;
}

嘿嘿比如
http://www.hawkwithwind.net/blog/2011/03/11/linux内核学习-c风格的面向对象/
http://www.hawkwithwind.net/blog/2010/11/26/linux发烧/
这两篇也挺好的~

但是他这个关键字匹配的方法,不是语法分析,很多都识别不出来。。不过咱已经满足了呵呵

入职的话也偶尔也可以感言一把

[咱最近中了银魂毒。。这标题有木有银魂味道orz|||有木有!]

好久没有写博客了。因为都是找实习啦看房子啦搬家啦这档子事,很累人,压力很大,也没啥值得写的。

今天好不容易混进百度做了张江猥琐男,偶尔感言一把应该不会被吐槽吧。

由于机密原因,咱就不说咱在百度具体干嘛了。今天光答个弱智保密测试题就花了一上午时间。。。

反正在看android以及symbian相关的东西吧。混蛋为毛没有iphone!!!
被骗进了质量部,如果不是老大恰好去年也在微软,比较有缘的话,咱是决计不会来这边的。不过既来之则安之吧,说是测试开发,其实是写一些测试工具之类的吧,也能从另一个角度修炼自己。真呆的不爽的话,早点滚蛋就是了。

晚上骑着车逛张江,在空无一人的寂寥大道上驰骋,尽情高声唱着歌,映衬着桔黄色的路灯,滚滚红尘(黄尘)汹涌地灌进领口、袖口,大有一骑绝尘、一往无前的气势。
(背景更换|||)
然。。。忽然发现。。莫名走进了一条还没修通的荒路(怪不得空无一人来着|||)

然而,大丈夫就应该相信自己的直觉,坚定自己的信念。挫折怕什么,吃亏怕什么,走回头路怕什么。
只要勇敢地向前冲!
只要相信自己!

就能从黑暗中,走出黎明!

就像明明迷了路的咱,也稀里糊涂找到了另外一条回家的路,虽然稍微远些原先在地图上没有选定,但是却是路更平更直,而且没有那么多烦人的摩托车的路。

真喜欢骑着辆破自行车四处乱转不计方向的感觉啊~好像回到了高中那无忧无虑的年代。

咱还真是中了银魂毒了啊啊啊。。
心中某处的那啥,不知道折断没有。。。

dota与人生

最近被实验室同学拉着打dota,打得昏天暗地的,太荒废了。
不过既然玩过头了,就干脆彻底玩痛快算了。其实咱是随遇而安的典型啊。。。|||

其实dota和人生还是很像的。当然dota和人生的最大区别就是人生没有输赢而已。不过其实dota路人局,自己打得再好还是可能输,与其追求胜负不如杀个痛快。从这个角度讲,就与人生过得是否精彩可以类比了。

初期:打好基础,积累优势
打dota,前期就是拼补刀,拼走位,拼基本功。同样道理,少年时代的我们拼的就是努力,拼的就是基础。当然还有玩。很多人不懂其实玩同样是一种重要的积累,积累知识,积累判断,积累价值观。面临生死抉择的挑战,只给你几秒钟时间判断局势预测趋势,不是每个人都能整天遇到这种事情的。假如真是这样,估计神经紧张累都得累死了。然而玩捉迷藏、丢沙包,却可以随时给你这种挑战。电子游戏更是如此(例如dota。。。啊啊啊我不是给自己打游戏找借口啊|||)。
初期人和人差别不显著,只需稍微用功大家都能达到接近的水平。这个阶段要耐住性子慢慢积累,所谓细节决定成败。日后这一点点的积累将会指数级别扩大为人生的度量衡。

中期:抓住机会,团结作战,减少损失,奠定局势
中期的dota变化多端,局势扑朔迷离。这个阶段,嗅觉和灵感非常重要。在良好的基本功的积累下,在这个阶段要抓机会,配合队友打几波成功的团战,或者自己趁局势混乱单抓/迅速farm/推塔,确立优势。
同样的,青年时代的我们需要的就是机遇和挑战,需要的就是认识更多朋友,当然还有长辈,老师,学长和前辈的帮助。
现在的我正向这个阶段迈进。真要说如何做得好,我没有那个资格。不过我非常憧憬将来可能发生的团战、gank还有集中推塔。希望能和各式各样的人合作,共同创造未来,“向胜利迈进”。

后期:耐心、决心
当dota到达可怕的后期,假如游戏还没有结束,则一定会进入一个胶着阶段。任何一个小失误都可能将前面建立的优势损失殆尽。这个阶段,必须耐心。原本大优的一方,经常为了破掉一路兵强上高地,结果被团灭反扑一波带走。然而,一旦对手露出破绽,又一定要有决心,一口气拿下,决不给对方喘息机会,否则下次失败的可能就是自己。
那些在人生的巅峰奋斗着的人们,一定就是在这样的巨大压力下度过的吧。就像一盘dota能达到2个小时很罕见一样,能走到这个地步的人也很少。不知道我的未来如何呢,是成是败,是速战速决40分钟推倒,还是真的打到了超级大后期?
人生就是因为变数才有乐趣啊!

谨以此献给大学以来所有一起打过dota的同学们~~

windows下不能创建名称为con的文件

今天偶然发现的,我想创建一个叫做con.txt的文件来保存数据库连接字符串,居然提示我“指定的设备名无效”。
网上查了查,原来con是windows的控制台设备描述符,所以被保留来不能创建这个名字的文件。
同样道理,例如com1之类名称的文件也都是不能创建的。

当然,你也可以想办法创建出这样的文件,方法网上有很多,这里不说了。而且创建出来之后,就无法简单地删除掉了。(当然想要删,方法也还是有的,网上也同样有很多这里不解释了)

圆周率节转圆周

上帝啊。。。我终于复活了!(是我家CQ…|||)
本来3.14节想出了一个挺好玩的想法,想实现一下,结果准备重启进入linux的时候机器就挂了orz|||
反复重启。光驱引导不能。
是BIOS病毒吗?

已经是晚上了,等不及送修,居然真的自己动手拆起机器来了!

真可惜啊,心情太焦急了居然没有心情拍照。人生第一次推倒啊(compaq娘|||

拆掉屏幕,拉下键盘,掀开后盖。取下风扇,拿掉散热片。CPU和显卡明晃晃地立着。为什么就是找不到CMOS线啊。。。
找到了个形似开关的东西按了几按。这样好像跟重置BIOS毫不相关吧。。
拆得这么零碎,真的还能组回去吗?组回去真的还能用吗?

还好。网上的攻略很给力……除了多出几个螺丝不知往哪里按,基本上都装回去了。尽管。。尽管原本的开机重启的问题完全没有解决。。
本来绝望的心冷静下来反而清醒了。重启或许只是硬盘本身的故障呢?光盘引导不能或许只是因为光盘没有读出来,所以又默认从硬盘引导,然后又重启了而已呢?
拔掉硬盘后再试光盘引导,果然不是反复重启的症状了。所以。。所以到头来无非是。。光盘太脏这个缘故吗。。多吐两口涂抹擦擦干净。。居然真的就进了live CD了。。。

转了一大圈,又回到原地。果然只不过是硬盘分区表损坏而已,什么BIOS病毒的。。都是自己胡诌啊胡诌。
或许。。或许我只是想找个借口拆拆本子吧。从来还没拆过本本的人。。

可惜这不明情况的分区表故障,貌似导致了grub无法识别硬盘,所以最后还是不得不重装系统了。。
所以本来圆周率节那个挺好的想法,只好留到其他节日再做咯。。。|||

啊哈哈凑足30小时无睡眠时间,好啦洗澡爬床~~