当前位置: 技术问答>linux和unix
在LINUX下写C++程序为什么这样会错呢
来源: 互联网 发布时间:2015-01-09
本文导语: #include #include #include #include #include class CTest { public: CTest(); ~CTest(); void SetValue(); virtual void TestValue(); }; CTest::CTest() { } CTest::~CTest() { } void CTest::SetValue() { TestValue(); } void CTest::TestValue() { } class CTestA :...
#include
#include
#include
#include
#include
class CTest
{
public:
CTest();
~CTest();
void SetValue();
virtual void TestValue();
};
CTest::CTest()
{
}
CTest::~CTest()
{
}
void CTest::SetValue()
{
TestValue();
}
void CTest::TestValue()
{
}
class CTestA : public CTest
{
public:
CTestA();
~CTestA();
virtual void TestValue();
};
CTestA::CTestA()
{
}
CTestA::~CTestA()
{
}
void CTestA::TestValue()
{
printf("test okn");
}
void main()
{
CTestA *t;
int shmid;
if((shmid = shmget(IPC_PRIVATE,sizeof(CTestA),IPC_CREAT)) == -1)
{
printf("shm get error!n");
exit(0);
}
if((t = (CTestA *)shmat(shmid,0,0)) == (CTestA *)-1)
{
printf("shm at error!n");
exit(0);
}
t->TestValue();
exit(0);
}
#include
#include
#include
#include
class CTest
{
public:
CTest();
~CTest();
void SetValue();
virtual void TestValue();
};
CTest::CTest()
{
}
CTest::~CTest()
{
}
void CTest::SetValue()
{
TestValue();
}
void CTest::TestValue()
{
}
class CTestA : public CTest
{
public:
CTestA();
~CTestA();
virtual void TestValue();
};
CTestA::CTestA()
{
}
CTestA::~CTestA()
{
}
void CTestA::TestValue()
{
printf("test okn");
}
void main()
{
CTestA *t;
int shmid;
if((shmid = shmget(IPC_PRIVATE,sizeof(CTestA),IPC_CREAT)) == -1)
{
printf("shm get error!n");
exit(0);
}
if((t = (CTestA *)shmat(shmid,0,0)) == (CTestA *)-1)
{
printf("shm at error!n");
exit(0);
}
t->TestValue();
exit(0);
}
|
你其他地方都可以算正确,和你的想法差不多,你的本意是通过共享内存来访问,即一个对象,通过共享内存指针来访问,但是对象中的构造函数是在
显式定义时才运行,连接它的TestValue()函数,你这儿只是强制转换为该
类的指针类型,该对象中的内容为空,t->TestValue()的指向的函数地址并不是TestValue()的函数地址,只是一个随机数,所以你可能运行会提示
segment fault或core dump; /?
显式定义时才运行,连接它的TestValue()函数,你这儿只是强制转换为该
类的指针类型,该对象中的内容为空,t->TestValue()的指向的函数地址并不是TestValue()的函数地址,只是一个随机数,所以你可能运行会提示
segment fault或core dump; /?
|
virtual void TestValue();
虚函数可以看作是 obj 一个指针成员,
你的 t->TestValue() 没有指向正确函数位置,
虚函数可以看作是 obj 一个指针成员,
你的 t->TestValue() 没有指向正确函数位置,