襄樊内燃机车厂李莉:What happened in this code?
来源:百度文库 编辑:高校问答 时间:2024/10/06 18:03:57
代码有点长,如果你没耐心读完,请不要在此发言,谢谢合作!!
请帮我分析一下,下面作了标记的一句代码到底发生了什么事?
里面内容涉及VTABLE,模拟了通过VTABLE来调用指定的成员函数.
//---------------------CODE From HERE--------------------
#include <iostream>
using namespace std;
class C1{
public:
C1(){};
void SetValue(int var1){
mVal=var1;
};
virtual int PrintValue(){
cout<<"In Class C1,Value="<<mVal<<endl;return 0;
};
virtual int PrintHello(){
cout<<"Hello World!!(In C1!)"<<endl;return 0;
};
protected:
int mVal;
};
class C2: public C1{
public:
C2():C1(){};
int PrintValue(){
cout<<"In Class C2,Value="<<mVal<<endl;return 0;
};
int PrintHello(){
cout<<"Hello World!!(In C2!)"<<endl;return 0;
};
};
int main() {
C1 obj1;
C2 obj2;
int (*pfn)(C1 *);//function pointer point to the member function
int **p; //a pointer point to the vtable
//设置初值
obj1.SetValue(999);
obj2.SetValue(888);
cout<<"------------------Obj1----------------"<<endl;
p=(int **) &obj1;
int var1=(int)*(p+1);//如果不要这一句,一切正常,没问题,如果执行了一这句就有问题了.
pfn=(int (*) (C1 *)) **p;
pfn(&obj1);//invoke member function printvalue;
pfn=(int (*) (C1 *)) *(*p+1);
pfn(&obj1);//invoke member function printhello;
cout<<"------------------Obj2----------------"<<endl;
p=(int **) &obj2;
pfn=(int (*) (C1 *)) **p;
pfn(&obj2);
pfn=(int (*) (C1 *)) *(*p+1);
pfn(&obj2);
return 0;
}
//----------------------------End OF THE CODE-----------------------------
有那一句的执行结果(不正确的结果):
------------------Obj1----------------
In Class C1,Value=4198685
Hello World!!(In C1!)
------------------Obj2----------------
In Class C2,Value=4198880
Hello World!!(In C2!)
没有那一句的结果(正确的结果):
------------------Obj1----------------
In Class C1,Value=999
Hello World!!(In C1!)
------------------Obj2----------------
In Class C2,Value=888
Hello World!!(In C2!)
注意,两个类的实例中的数据都发生了变化.经过调试发现实际内存中的数据并未发生变化(是正确的),应该是这个变量的地址出了问题.
请帮我分析一下,下面作了标记的一句代码到底发生了什么事?
里面内容涉及VTABLE,模拟了通过VTABLE来调用指定的成员函数.
//---------------------CODE From HERE--------------------
#include <iostream>
using namespace std;
class C1{
public:
C1(){};
void SetValue(int var1){
mVal=var1;
};
virtual int PrintValue(){
cout<<"In Class C1,Value="<<mVal<<endl;return 0;
};
virtual int PrintHello(){
cout<<"Hello World!!(In C1!)"<<endl;return 0;
};
protected:
int mVal;
};
class C2: public C1{
public:
C2():C1(){};
int PrintValue(){
cout<<"In Class C2,Value="<<mVal<<endl;return 0;
};
int PrintHello(){
cout<<"Hello World!!(In C2!)"<<endl;return 0;
};
};
int main() {
C1 obj1;
C2 obj2;
int (*pfn)(C1 *);//function pointer point to the member function
int **p; //a pointer point to the vtable
//设置初值
obj1.SetValue(999);
obj2.SetValue(888);
cout<<"------------------Obj1----------------"<<endl;
p=(int **) &obj1;
int var1=(int)*(p+1);//如果不要这一句,一切正常,没问题,如果执行了一这句就有问题了.
pfn=(int (*) (C1 *)) **p;
pfn(&obj1);//invoke member function printvalue;
pfn=(int (*) (C1 *)) *(*p+1);
pfn(&obj1);//invoke member function printhello;
cout<<"------------------Obj2----------------"<<endl;
p=(int **) &obj2;
pfn=(int (*) (C1 *)) **p;
pfn(&obj2);
pfn=(int (*) (C1 *)) *(*p+1);
pfn(&obj2);
return 0;
}
//----------------------------End OF THE CODE-----------------------------
有那一句的执行结果(不正确的结果):
------------------Obj1----------------
In Class C1,Value=4198685
Hello World!!(In C1!)
------------------Obj2----------------
In Class C2,Value=4198880
Hello World!!(In C2!)
没有那一句的结果(正确的结果):
------------------Obj1----------------
In Class C1,Value=999
Hello World!!(In C1!)
------------------Obj2----------------
In Class C2,Value=888
Hello World!!(In C2!)
注意,两个类的实例中的数据都发生了变化.经过调试发现实际内存中的数据并未发生变化(是正确的),应该是这个变量的地址出了问题.
What happened in this code?
1066what happened in england?
what happened to the titanic?(in English)
It shows what has happened to the forests of the USA in the last 350years.
what it has happened to to the forest for the USA in the last 350 years ?这样对吗?为什么?
翻译:"where you all surprised?和what happened to the tree?和do you still live in that house?
Give me your version of what happened.
Give me your version of what happened.
what has happened是什么意思 请明确解释一下
what has happened?是什么意思 为什么用HAS