June 19th, 2007Covariant return types

Covariant return types–翻译成中文的字面意思应该是协变返回类型, 它的意思可以概括为在面向对象的编程中, 子类在重写父类的方法时可以改变这个方法的返回值的类型. 一般来讲子类在重写(override)父类方法时, 要求这个方法在参数列表和返回值上都要和父类中的对应的方法保持相同的类型. 所以下面的代码是无法通过编译的:

class Base
{
public:
virtual int foo () {return 0;}
};

class Child : public Base
{
virtual long foo () {return 1;} //compile error, 'Child::foo': overridin
//virtual function return type differs
//and is not covariant from 'Base::foo'
};

也许大家还没有看到这个限制的不爽之处, 那么设想如下的情形, 你想为你的父类和子类都写一个clone ()方法, 返回一个clone出的对象的指针, 如果没有Covariant return type, 你需要写类似如下代码:

class Base
{
public:
Base* clone ();
};
class Child : public Base
{
public:
Base* clone ();
};

Child* bp = static_cast<child*>(child.clone ());</child*>

这里每个子类的clone方法都返回一个指向Base的指针, 如果想要转换成子类的指针还需要一次额外的类型转换, (当然也许你认为使用static_cast会在编译期间完成, 不会影响运行效率, 但显然代码不够优雅:) 如果使用Covariant return type, 我们就可以把每个子类的clone方法返回一个指向子类对象的指针类型了:

class Base
{
public:
Base* clone ();
};
class Child : public Base
{
public:
Child* clone ();
};
Child* bp = child.clone (); //no extra type cast needed.

实际上Covariant return type就是用来这种在子类重写父类方法, 并且它的返回值的类型和父类方法的返回类型具有一定的相关性(一般是其衍生类型即派生类). 在C++标准03版的10.3.5中对其covaraiant return type做了详细的描述. 大家有兴趣可以去翻一下.

Macshift 是一个基于GPL版权发布的在WinXP下修改网卡硬件地址的软件, 它是一个命令行工具, 基本的使用如:

macshift.exe -i “本地连接” 00105CE16350

-i后面指定你要修改的网络设备的名称(如果不知道具体的网卡名称, 可以在命令窗口中输入ipconfig, 找到你对应的网卡, 一般会有若干个类似:”Ethernet adapter 本地连接: ….” 的输出, 这里的本地连接就是你的某个网络设置的名字了), 最后面就是指定的mac地址, 当然如果你不指定的话, 它会随机生成一个mac地址给你的这个网卡.

如果需要还原某个网卡的mac地址, 可以使用 macshift -i “本地连接” -d, 具体详细的说明可以去它的主页看.

另外macshift的主页在这里, 或者点击macshift下载它

June 16th, 2007Keep silent

“当他们屠杀犹太人时,我没有作声,因为我不是犹太人;当他们屠杀基督徒时,我没有作声,因为我不是基督徒;当他们来抓共产党人时,我保持沉默,因为我不

是共产党人;后来他们要杀我,已经没有人能为我作声了……”, 嗯, 事不关已, 高高挂起, 现在自已大抵就是这么个状态.
  还没有轮到自己, 于是继续沉默…

June 12th, 2007试用WordPress

  感觉还不错,见我的测试blog,刚搞了个虚拟主机空间, 一时没有主意要做什么, 于是先弄个blog程序上去, 浪费些带宽, 不然不用太浪费了….
  用着的感觉就是: 专业的blog程序就是比咱们这的强… 可定制性很高, 不过显然我的那个测试blog估计是活不了多久的… 因为我确实不知道要往上面写什么, 主要是尝试一下wordpress(很奇怪自己原来为什么不在自己机器上安个玩… 非得花钱了才想起来用.)
  可是现在有个问题, 就是那个空间要怎么用哪…

June 12th, 2007Post with codes.

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

June 12th, 2007Hello World!

试用WordPress, 这里写些技术类文章:)


© 2007 pangwa's Blog | iKon Wordpress Theme by Windows Vista Administration | Powered by Wordpress