关于this指针测试程序,有一点问题。

Teaerror 2010-05-17 11:35:56
孙鑫的C++教程,里面让自己写一个this指针测试程序,来证明this指针指向的是派生类。我几经修改,终于得到了想要的结果。

//VS2010

#include <iostream>
using namespace std;

class Base;
Base* p;
class Base
{
public:
Base()
{
p=this;
}
virtual void fun()
{
cout<<"Base!"<<endl;
}
};

class Child : public Base
{
void fun()
{
cout<<"Child!"<<endl;
}
};
Child ch;

int main()
{
p->fun();
system("pause");
return 0;
}

//结果是输出"Child!"


有3个小问题要问。
1:这程序最开始最困扰我的地方就是如果不加virtual关键字,那么将会输出"Base!",最开始给我的错觉是如果加了virtual再测试就没有意义了,不过后来又仔细读了程序发现确实是能够证明this指针指向派生类的。不过我的基础有点不牢,想问一下如果基类没有加virtual关键字,子类定义了一个同名的函数,那么程序是如何执行的?
2:Child ch; 为什么一定要用子类生成一个对象?否则会报错。
3:一定要先声明一个Base类(class Base;),然后在用这个类定义一个指针(Base* p;),而如果不写class Base;这条语句,直接把Base* p;放在Base类的定义后面就会报错,为什么。

谢谢啦!
...全文
63 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-05-17
  • 打赏
  • 举报
回复
1.没加virtual的话就是静态绑定了,指针是什么类型那么就执行相应的类的那个函数

2.你调用函数至少要给一个有意义的对象的地址吧。

3.这个属于自定义类型,不是语言内置类型,所以在使用前你要先声明这个类型。
arong1234 2010-05-17
  • 打赏
  • 举报
回复
1. 没有virtual,不管它指向谁,只要类型是基类指针类型,就执行基类的函数,只要类型是派生类的,就执行派生类的函数,这只合指针类型有关
2. 因为如果你不定义一个ch,谁来调用p=this呢?
3. 因为所有的变量必须先定义后使用。你在类后面定义,但是在类中使用,就违背了这个规定

64,637

社区成员

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

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