哪位哥哥能够解释一下为什么这段代码在vc60下面编译和运行时所发生的错误?
bjhua 2004-12-17 03:16:07 #include <iostream>
#include <stdlib.h>
#include <string>
#include <iomanip>
using namespace std;
class A
{
public:
int i;
A(string n):name(n)
{
i = 11;
j = 100;
cp = "test";
}
void f()
{
cout << "A::F()" << endl;
}
virtual void test()
{
cout << "a's address is " << this << endl;
cout << "(" << name << ")" << "A::test" << endl;
}
private:
int j;
char* cp;
string name;
};
class B : public virtual A
{
public:
B(string s):A(s){}
};
int main(int argc, char *argv[])
{
void (A::*fp)();
A* a = new A("a1");
fp = &A::test;
(a->*fp)();
int* ptr = (int*) a;
int *vtable;
cout << "A::" << endl;
cout << (int)(a) << endl;
cout << (*(ptr+2)) << endl;
cout << (char*)(*(ptr+3)) << endl << endl;
//a's address
cout << "A::test" << endl;
//address of vtable
vtable = (int*)(*ptr);
//address of test = vtable
cout << (int)(*vtable) << endl;
//cout <<(int)(a->*fp) << endl;
//cout << showbase << hex << *vtable << endl;
//cout << 0x00401131 << noshowbase << endl ;
cout << "a.address=" << a << endl;
//cout << "a->test()" << endl;
a->test();
typedef void FUN(register A* ap);
FUN * t = (FUN*)(* vtable);
cout << "t(a)" << endl;
t(a); //内存访问错误,对象a的地址有问题。汇编的代码看不懂:(
//cout << (int)(a->*fp) << endl;
//a::ff
cout << "A::F" << endl;
typedef void (*FF)(register A* ap);
cout << (&A::test) << endl;
int ii = (int) &A::test; //这种造型在vc里面不行,但在g++里面是可以的:(
FF f = (FF) ii;
(*ff)(a);
delete a;
system("PAUSE");
return 0;
}