觉得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;
就不灵了,不会准确地调用析构函数了,当类复杂的时候,很容易弄出内存泄露来。