this指针,虚函数,base::show()作用域操作符

heguo2chao3 2010-03-14 11:19:48
刚刚在帖子看到了关于this指针的传递,自己写了个实现程序 不理解,谁能解释一下不?

#include<iostream>
using namespace std;

class base
{
int a;
public:
base():a(0){}

virtual void show()
{
(this->a)++;
cout<<" base::show()"<<endl;
cout<<a<<endl;
cout<<this;
}
virtual void put()
{
show();

}
};

class derived:public base
{
int a;

public:
derived(int b):a(b){}
virtual void show()
{
(this->a)++;
cout<<" derived::show()"<<endl;
cout<<a<<endl;
cout<<this;
}
virtual void put()
{
base::show();

}
};

void main()
{
base* pbase=new derived(2222222);
pbase->put();
cout<<endl;
pbase->show();
}

一下是输出结果
base::show()
1
00381F38
derived::show()
2222223
00381F38 Press any key to continue

我的疑惑:
cout<<this时;两次一样 但是执行(this->a)++却是++的不同a,不理解

base::show();
此处的this指针是如何传递的。

:: 作用域操作符具体在内部做了什么

...全文
294 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
heguo2chao3 2010-03-15
  • 打赏
  • 举报
回复
期待牛人来彻底解释清楚 上面好心人说的 我都懂 但是还是不能解释我的问题
dubiousway 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 heguo2chao3 的回复:]

引用 2 楼 demon__hunter 的回复:
首先lz要知道this指针始终指向对象本身,用pbase调用任何成员函数输出this值,都是pbase的值

那如何解释(this->a)++会有不同的值呢
还有base::show()按理说不是对象的成员函数啊
[/Quote]

虚函数也是被继承的。只不过当被子类覆盖的时候,子类用新的(自己定义的覆盖函数)函数,放在自己的虚函数表中(如果不覆盖,则是父类的虚函数)。即使覆盖,还是可以调用原来的被覆盖的
taodm 2010-03-15
  • 打赏
  • 举报
回复
楼主真好奇的话,就去啃《深度探索C++对象模型》
we_sky2008 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 heguo2chao3 的回复:]
base::show();
此处的this指针是如何传递的。

:: 作用域操作符具体在内部做了什么[/Quote]
其实就是把pbase的值传递给隐式的this参数
通过静态调用(不通过虚表)基类的show函数
we_sky2008 2010-03-15
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;

class base
{
int a;
public:
base():a(0){}

virtual void show()
{
(this->a)++;
cout<<" base::show()"<<endl;
cout<<a<<endl;
cout<<this;
}
virtual void put()
{
show();
}
};

class derived:public base
{
int a;//隐藏了基类的数据成员a
public:
derived(int b):a(b){}
virtual void show()
{
(this->a)++;
cout<<" derived::show()"<<endl;
cout<<a<<endl;
cout<<this;
}
virtual void put()
{
base::show();//此处为虚函数的静态调用 修改的是基类部分的数据成员a
}
};

void main()
{
base* pbase=new derived(2222222);
pbase->put();//调用派生类的put函数 在该函数里静态调用基类的base::show();修改基类部分的数据成员a cout<<endl;
pbase->show();//在派生类的虚函数show()中:基类的数据成员a被派生类的数据成员a隐藏}
yuzl32 2010-03-15
  • 打赏
  • 举报
回复
pbase->put();的过程是:derived::put(); -> base::show();
pbase->show();的过程是:derived::show();
heguo2chao3 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 we_sky2008 的回复:]
[Quote=引用 11 楼 heguo2chao3 的回复:]
[Quote=引用 8 楼 we_sky2008 的回复:]

#include<iostream>
using namespace std;

class base
{
int a;
public:
base():a(0){}

virtual void show()
……
[/Quote]

谢谢 !!!懂了 懂了····
we_sky2008 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 heguo2chao3 的回复:]
[Quote=引用 8 楼 we_sky2008 的回复:]

#include<iostream>
using namespace std;

class base
{
int a;
public:
base():a(0){}

virtual void show()
{
(this->a)++;
cout<<" base::sh……
[/Quote]


楼主可以添加如下代码测试:
derived d(5);
cout<<"派生类对象总大小:"<<sizeof(d)<<endl<<"虚函表地址:"<<(int*)*((int*)&d)<<endl<<"基类部分成员a = "<<*((int*)(&d)+1)<<endl<<"派生类部分成员a = "<<*((int*)(&d)+2)<<endl;
we_sky2008 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 heguo2chao3 的回复:]
[Quote=引用 8 楼 we_sky2008 的回复:]

#include<iostream>
using namespace std;

class base
{
int a;
public:
base():a(0){}

virtual void show()
{
(this->a)++;
cout<<" base::sh……
[/Quote]
如果VPTR被安插在最前面的话:
从上到下依次为:
VPTR(指向derived类的虚表)
base::a
derived::a
taodm 2010-03-15
  • 打赏
  • 举报
回复
全看。当然了,这是一本纯满足好奇心的书。
heguo2chao3 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 taodm 的回复:]
楼主真好奇的话,就去啃《深度探索C++对象模型》
[/Quote]
我刚好昨天有了这本书 该看哪些章节?
heguo2chao3 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 we_sky2008 的回复:]

#include<iostream>
using namespace std;

class base
{
int a;
public:
base():a(0){}

virtual void show()
{
(this->a)++;
cout<<" base::show()"<<endl;
cout<<a<<endl;
co……
[/Quote]
你的意思是有两个a吗 一个基类的 一个派生类的 那在内存中如何存储呢?
机智的呆呆 2010-03-14
  • 打赏
  • 举报
回复
由于父类base中有show函数而且是虚函数,而子类重写了show这个函数,所以指向子类对象的父类指针在调用show函数是激活动态绑定,实质是一个查找虚表的过程,最终调用的子类自己的那个show函数。而base::show()是告诉编译器在调用show时直接调用父类的show的函数,而不是查找虚表~~~
heguo2chao3 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 demon__hunter 的回复:]
首先lz要知道this指针始终指向对象本身,用pbase调用任何成员函数输出this值,都是pbase的值
[/Quote]
那如何解释(this->a)++会有不同的值呢
还有base::show()按理说不是对象的成员函数啊
机智的呆呆 2010-03-14
  • 打赏
  • 举报
回复
首先lz要知道this指针始终指向对象本身,用pbase调用任何成员函数输出this值,都是pbase的值
heguo2chao3 2010-03-14
  • 打赏
  • 举报
回复
自己顶·····

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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