我们排除使用函数指针地情况。因为它不够对象化,当然也许未来可能需要使用。所以不用忘了这是一种可以使用的方式。
其次我们来思考一下使用编译器为什么我们生成指向vtable地指针。这个东西编译器会为写代码来设定它地值。你想修改它将面临不少问题。 具体可以参考我的blog
C++中默认的(拷贝)构造函数 如何处理类对象中 指向vtable 这4个字节的空间的内容 (2)
http://blog.youkuaiyun.com/zhuixundelang/archive/2006/07/31/1005085.aspx
当然事实上你可以改变它。但是代价是你所不能接受的。除非你 被人拿抢指着你的额头。
好了,现在就只剩下 指向类对象的指针了!!
就是这样。就是它了。在这里我碰到问题了。如果使用指向类对象昂的指针,我们需要考虑到谁来分配空间,
谁来释放空间 。真羡慕java。至少不用考虑这种烦人的问题。
这里我 无法给出答案。因为我也不晓得。你自己看着办吧。
我将试图用我得代码来描述这个东西。但是我也觉得我得代码怪怪的。
#include <iostream>
using namespace std;
class Inteface
{
public:
virtual void fn()
{
cout<<"Inteface::fn"<<endl;
}
};
class DFI1:public Inteface
{
public:
void fn()
{
cout<< "DFI1:fn/n";
}
};
class DFI2:public Inteface
{
public:
void fn()
{
cout<< "DFI2:fn/n";
}
};
class Com:public Inteface
{
public:
void fn()
{
if( pI !=NULL )
pI->fn();
}
Com(Inteface *pi):pI(pi)
{
}
void SetpI(Inteface *pi)
{
this->pI = pi;
}
protected:
Inteface *pI;
};
/*
事实上你可以看到很多代码Com是没有数据成员( Inteface *pI)的,而是只有方法
并且这个方法是重载了Inteface的方法,然后在Com的派生类中加入相应的
数据成员( Inteface *pI),然后再在子类中重载 Inteface的方法。
不过这里我没有这么做。
注意decorator的 功能是 动态地改变对象地行为 !!
*/
class DFCOM1:public Com
{
};
int main(int argc, char* argv[])
{
DFI1 df1;
DFI2 df2;
Inteface i;
Com c1(&df1);
c1.fn();
c1.SetpI(&df2);
c1.fn();
c1.SetpI(&i);
c1.fn();
return 0;
}
好了。游戏结束了。
也许看到 c1.SetpI(&i);让你觉得不爽。但是这确实可以改变类地行为。
无耻哦我