哪位哥哥能够解释一下为什么这段代码在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;
}
...全文
63 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cowboy2006 2004-12-17
  • 打赏
  • 举报
回复
有一疑问:
int ii = (int) &A::test();
是什么意思?
lw1a2 2004-12-17
  • 打赏
  • 举报
回复
函数f()没有出口

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧