《深度探索C++对象模型》学习笔记(5-7章)

第5章 构造析构和拷贝

虚函数

对于抽象类而言,是否应该自己负责初始化类内的数据成员?(别忘了抽象类也可以有非纯虚函数和数据成员)

  • 一般情况下被认为子类要负责从基类继承来的数据成员的初始化
  • 或者基类必须提供一个显式的构造函数用于自己数据成员的初始化
  • 最好的方法则是将行为和数据分离,提供接口专门用于定义方法
class A_B
{
public:
    virtual ~A_B() = 0;
    virtual void Say() const = 0;
    inline char const* GetData() const { return iData; }
protected:
    A_B( char* aData ) : iData( aData ) {  }
protected:
    char* iData;
};
inline A_B::~A_B() {}
 
class C_D : public A_B // concrete derived class
{
public:
    C_D( char* aData, char* aData2 ) :
           A_B( aData ), iData2( aData2 ) { cout< <"c_d ctor"<<endl; }
    virtual ~C_D() { delete iData2; }
    virtual void Say() const { cout<<"c_d says: "<<iData<<endl; }
    void Say2() const { cout<<"c_d says2: "<<iData2<<endl; }
public:
    char* iData2;
};

纯虚函数

  • 拥有定义的纯虚函数(这还叫纯虚函数么)可以在子类中进行调用。不过就是什么用都没有罢了。
//定义
inline void A_B::Say() const { cout< <"hey!"; }
//调用,发现hey!并没有打印出来
virtual void Say() const { A_B::Say(); cout<<"c_d says: "<<iData<<endl; }
  • 实际上是否让纯虚函数拥有(没用的)定义由程序员说了算。
  • 但唯一的例外是纯虚析构函数,必须像上面那样进行显式定义 A_B::~A_B() {}
    • 否则就会出现错误,严格来说并非编译错误,而是链接错误。
    • 原因很简单,析构函数和构造函数一样,子类的都会由编译器进行扩充,调用基类的版本。
    • 不希望这么定义的话,解决方法只有生命非纯虚的析构函数

Virtual Specification

  • 不加选择地将函数设定为virtual在效率上会不升反降,不能依赖编译器的优化
  • 应付const也会令人头疼,例如在基类中不需要修改的const ref或者const pointer,到了子类就需要修改了。目前最好的方法是不用const(……无语)
  • 需要考虑到的(不全)
    • 抽象类的构造函数需要负责初始化自己的数据成员,可以声明为protected避免外部访问
    • 缺少多态需求的函数不要设定为virtual,尤其是inline函数
    • 慎用const,除非确定派生类也不会修改const修饰的对象

Read more >>>

最近

最近一篇blog是1月写的去年阅读总结。这俩月并非抽不出时间写点东西,问题在于拿不出东西可写。于是觉得写写最近做的事、玩的游戏、看的书,凑数成一篇blog吧。

微软和Nokia合作,成了Mikia(黑桐干也:谁叫我?),于是之前Qt辛辛苦苦整出来的那一套QtQuick又成了后妈生的。QtQuick和QML虽然是被逼出来的一种界面、引擎代码分离解决方案,但实际上可玩性相当高。QML的语法容易学(至少比XAML更容易懂),对于美工、UX或者原型设计师来说好用,再会点JS,可以替代Flash作为界面原型和UI演示的制作工具(如果再有个Blend那样的工具就更好了)。比如这个例子,模拟WP7主屏,都是利用QML自带动画和标签实现的效果。

春节期间补了一下神作《空之境界》。之前一直没看是因为误解了标题中的“空”为“天空”的空,于是脑补了最不喜欢看的宇宙大战、机器人肉搏之类的场景……年三十儿那天偶然点进去了《空镜》的Wikipedia页面,发现那个空不读sora而是kara,也就是“色即是空”的那个“空”,于是一下子就哲♂学了。动画已经补课完毕,开始看小说版。

一般来说,死程序员在完成本职工作外都会对更底层的东西感兴趣,比如做C#的通常都会学学CLR;写脚本的会自己拆拆Python、Ruby的源代码;做C/C++的都会搞搞汇编、编译器之类的;做汇编的学机器码;玩机器码的……用针扎出来win98?于是我下定决心开始重新学习8086和80×86汇编了。教材用的是王爽著《汇编语言》。推荐个神器emu8086。

STG尝试中——体会就是,数学功底太差和想象力不足(比如我)不适合做弹幕类STG!

金田一少年事件簿(新)几部观后感

观后感即,金田一系列已经进入了所谓长篇动画定势魔咒了。当然新系列中几部的手法比较华丽,但如果没有经过扫雷照单全看的话,还是会被某些作品雷到,比如大名鼎鼎的《剑持警部杀人》。下次是不是改出《七濑美雪杀人》了?

好,那么下面就根据“新系列”中的《狱门塾》、《不动高校杀人》、《一万米高空杀人》、《剑持警部杀人》以及《黑魔法杀人》来归纳一下金田一少年事件簿的定势吧。

以下文字涉及到大量剧透,请酌情选择是否继续阅读。

地狱傀儡师(刚发现这个名字很值得吐槽,和二阶堂系列的地狱魔术师是亲戚吗?)高远遥一找到某个几年~十几年前因为事件成为受害者的人,告诉他/她可以帮着报仇;

组织一堆当年事件的关联人,一般都是合谋的凶手,再联系七濑美雪,间接把金田一带入事件;

将所有人聚集到一个闭锁空间内(深山老林、孤岛、暴风雨山庄);

当当当!高远遥一出场,必定带着一个恶心的面具,让人恨不得见到第一眼就扒下来那种。然后各种调戏挑衅金田一;

凶手杀人!金田一同时跟进,但必定不能在只剩下一个活口之前将凶手捉拿归案;

金田一:“我以我爷爷的名字发誓!”,然后靠着各种匪夷所思的提示破案!

凶手百般抵赖:“你丫知道手法吗?知道了啊……不能证明我是嫌疑人啊?证明了啊……但你没有证据啊!……证据也有了?!我靠。好吧其实我是迫不得已杀人……”然后blah blah blah把之前的案件从头到尾说一遍,然后大家都觉得,妈的这几个人渣死有余辜嘛!

凶手:“我同意!所以我要把最后一个活口干掉!”于是抄刀(当然也有可能是任何手边的凶器)杀将过去!活口这时也觉得自己简直是人渣,必须死!所以根本不躲。

这个时候,挡刀的人按照此顺序排列:凶手的同谋、金田一、路人。反正活口是肯定活下来了。

金田一进入说教模式,凶手醒悟:“谢谢你,金田一!”后被带上警车。

高远遥一:“搞屁啊……没人抓老子吗?”金田一(如果有明智警视或者剑齿警部的话会一起):“抓丫,要活动!”然后必定会被高远逃脱。

金田一:“下次一定要抓到你!”高远:“下次再来搞哦~”七濑美雪对金田一好感度+1。

读者摔书:“搞屁啊……”

《我的抗战》

为什么在国家级电视台看不到这部纪录片?

还好搜狐视频提供了完整的视频:http://tv.sohu.com/s2010/wodekangzhan/

切记不要酒后乱性

呑ンダラ「ノル」ナ
「ノル」ナラ呑ムナ
酒ハ呑ンデモ
呑マレルナ
__墨埜谷暮羽
上面是暮羽的血泪控诉。下图只是本集空之音番外的福利之一。