首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ 来看看为什么输出时这个结果解决方法

2012-05-29 
c++ 来看看为什么输出时这个结果#include iostreamusing namespace stdclass A{public:void f(){cout

c++ 来看看为什么输出时这个结果
#include <iostream>
using namespace std;
class A
{
public:
void f()
{
cout<<"A.........."<<endl;
}
void g()
{
f();
}

};
class B:public A
{
public:
void f()
{
cout<<"B.........."<<endl;
}
};
int main()
{
B *p,a;
p = &a;
p->g();
return 0;
}

[解决办法]
反汇编后看
g()中调的f() 是一个call xx 而这个xx是代码段中的地址, 是不会动态改变的。

[解决办法]
mark。。。。。。。同问,等大侠解决
[解决办法]
virtual void f();
如果是虚函数就可以动态联编了。
[解决办法]
想了一下,因为在派生类B中继承了基类A的成员函数g(),那么B中的g()是不是在B中的f()的前面定义了,名字查找的时候因为类B中的f()还未声明,就找到了基类中的f(),所以输出A........
[解决办法]
class B:public A
{
public:
void f()
{
cout<<"B.........."<<endl;
}

void g()
{
f();
}
};
int main()
{
B *p,a;
p = &a;
p->g();
return 0;
}

如果我们这样子想象派生类B继承了g(),我们把它在B中扩展,那么得到的结果将是B........
[解决办法]
经过反汇编为:
2: void main()
3: {
0040D760 push ebp
0040D761 mov ebp,esp
0040D763 sub esp,5Ch
0040D766 push ebx
0040D767 push esi
0040D768 push edi
0040D769 lea edi,[ebp-5Ch]
0040D76C mov ecx,17h
0040D771 mov eax,0CCCCCCCCh
0040D776 rep stos dword ptr [edi]
4: int a[5]={1,2,3,4,5};
0040D778 mov dword ptr [ebp-14h],1
0040D77F mov dword ptr [ebp-10h],2
0040D786 mov dword ptr [ebp-0Ch],3
0040D78D mov dword ptr [ebp-8],4
0040D794 mov dword ptr [ebp-4],5
5: int i=0;
0040D79B mov dword ptr [ebp-18h],0
6: int x=a[i++]+a[i++]+a[i++];
0040D7A2 mov eax,dword ptr [ebp-18h]
0040D7A5 mov ecx,dword ptr [ebp+eax*4-14h]
0040D7A9 mov edx,dword ptr [ebp-18h]
0040D7AC add ecx,dword ptr [ebp+edx*4-14h]
0040D7B0 mov eax,dword ptr [ebp-18h]
0040D7B3 add ecx,dword ptr [ebp+eax*4-14h]
0040D7B7 mov dword ptr [ebp-1Ch],ecx
0040D7BA mov ecx,dword ptr [ebp-18h]
0040D7BD add ecx,1
0040D7C0 mov dword ptr [ebp-18h],ecx
0040D7C3 mov edx,dword ptr [ebp-18h]
0040D7C6 add edx,1
0040D7C9 mov dword ptr [ebp-18h],edx
0040D7CC mov eax,dword ptr [ebp-18h]
0040D7CF add eax,1
0040D7D2 mov dword ptr [ebp-18h],eax7: printf("%d",x);
0040D7D5 mov ecx,dword ptr [ebp-1Ch]
0040D7D8 push ecx
0040D7D9 push offset string "%d" (0042201c)
0040D7DE call printf (004010d0)
0040D7E3 add esp,8
8: printf("%d",i);
0040D7E6 mov edx,dword ptr [ebp-18h]
0040D7E9 push edx
0040D7EA push offset string "%d" (0042201c)
0040D7EF call printf (004010d0)
0040D7F4 add esp,8
9:
10: }

[解决办法]
class B继承了class A的public
如果不显示override函数f(),则class B使用的还是class A中的f()
改成下面的,就可以实现重载
#include <iostream>
using namespace std;


class A
{
public:
 virtual void f()
 {
 cout<<"A.........."<<endl;
 }
 void g()
 {
 f();
 }
 
};
class B:public A
{
public:
 virtual void f() override
 {
 cout<<"B.........."<<endl;
 }
};
int main()
{
 B *p,a;
 p = &a;
 p->g();
 return 0;
}


热点排行