#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
class CBase
{
public:
virtual void fn()
{
;
}
virtual void Add(CBase b)
{
}
virtual void Add(CBase *pb)
{
}
CBase( const CBase &b)
{
::memcpy( (void*)this, (void *)&b,sizeof(CBase) );
}
CBase &operator=( const CBase &b)
{
::memcpy( (void*)this, (void *)&b,sizeof(CBase) );
return *this;
}
CBase()
{
}
};
class CPart :public CBase
{
public:
void fn()
{
cout<<"p:fn"<<endl;
}
};
class CCom:public CBase
{
public:
void fn()
{
cout<< "com:fn"<<endl;
vector<CBase>::iterator itb,ite;
itb = this->m_vb.begin();
ite = this->m_vb.end(); //
for( ; itb != ite ; ++itb)
(*itb).fn();
}
void Add(CBase b)
{
m_vb.push_back( b);
}
virtual void Add(CBase *pb)
{
m_pvb.push_back( pb);
}
protected:
vector<CBase> m_vb; //
};
int main(int argc, char* argv[])
{
CPart p1,p2,p3,p4;
CCom c1,c2;
CBase *pb = &p1;
pb->fn();
pb= &c1;
pb->Add( p1);
pb->Add( p2);
pb->Add( p3);
pb->fn();
return 0;
}
输出:
p:fn
com:fn
p:fn
p:fn
p:fn
//使用工具:vc6
我们强制修改 对象的pvtbl(也就是指向vtable的指针)。所以即使是使用对象也可以实现多态性,、
但是别忘了平台有关性。
此外通常我们是不修改pvtbl的!!