首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

觉得c++里引用一个不好的地方解决方案

2012-02-10 
觉得c++里引用一个不好的地方#includeiostream.hclassA{public:intvA(){}virtualvoidf(){cout A::f(

觉得c++里引用一个不好的地方
#include   <iostream.h>

class   A
{
public:
int   v;
A()   {   }
virtual   void   f()   {   cout   < <   "A::f() "   < <   endl;   }
virtual   ~A()   {   }
};

class   B   :   public   A
{
public:
B()   {   }
void   f()   {   cout   < <   "B::f() "   < <   endl;   }
~B()   {   }  
};

int   main(int   argc,   char*   argv[])
{
A   *pa   =   new   B();
pa-> v   =   1;
A   c;
c.v   =   2;

A   &ra   =   *pa;
ra.f();
ra   =   c;
ra.f();

delete   pa;
return   0;
}

上面程序将输出两行B::f()

为什么不把虚表也拷贝过去呢?这样如果不知道的话,往往就因为这样的机制而调试很久,

[解决办法]
这个与引用无关吧。C++中如果将对象按字节拷贝是不会将虚函数表指针一起拷进去的。除非硬来:unsigned char *p = (unsigned char*)pa;
unsigned char *q = (unsigned char*)&c;
for(int i=0; i <sizeof(c); i++)
p[i] = q[i];

[解决办法]
哦,是我没想清楚楼主的问题,乱说了。
一楼说得没错,“对象拷贝”是不影响虚表的。
ra本来在引用着一个B类的对象,这一点是不会变的。
ra = c;
这句只是修改了那个被引用着的对象的基类子对象而已。不能修改虚表,一旦修改了,那就是说它现在还是引用着一个b类对象(),却拥有着A类的虚表,那样,你后面那句:
delete pa;
就不灵了,不会准确地调用析构函数了,当类复杂的时候,很容易弄出内存泄露来。

热点排行