c++中基类与派生类中隐含的this指针的分析

简介:

先不要看结果,看一下你是否真正了解了this指针?

复制代码
 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Parent{
 5      public:
 6          int x;
 7          Parent *p;
 8      public:
 9          Parent(){}
10          Parent(int x){
11            this->x=x; 
12            p=this;
13         }
14          virtual void f(){
15             cout<<"Parent::f()"<<endl; 
16         }
17         void g(){
18             cout<<"Parent::g()"<<endl;
19         }
20     
21         void h(){
22             cout<<"Parent::h()"<<endl;
23             f();
24             g();
25             y();
26             cout<<"LOOK HERE: "<<x<<endl;
27         }
28         
29         private:
30             void y(){
31                 cout<<"Parent::y()"<<endl;
32             }
33 };
34 
35 class Child : public Parent{
36     public:
37         int x;
38         
39     public:
40         Child(){}
41         Child(int x) : Parent(x+5){//正确的调用父类构造函数要写在初始化型参列表中 
42             
43              //这样企图调用父类的构造函数是错误的,因为这是另外创造了一个临时对象,函数结束之后就什么都没有了! 
44             //Parent(x+5);
45             this->x=x;
46         }
47         void f(){
48             cout<<"Child f()"<<endl;
49         }
50         void g(){
51             cout<<"Child g()"<<endl; 
52         }
53 };
54 
55 int main(){
56     //例一 
57     Child *ch=new Child();
58     ch->h(); 
59     cout<<endl;
60     //例二: 
61     ch=new Child(5);
62     ch->h();
63     cout<<endl;
64     
65     //例三: 
66     ch->p->h();
67     return 0;
68 } 
复制代码
复制代码
/*
Parent::h()
Child f()
Parent::g()
Parent::y()
LOOK HERE: 9306304

Parent::h()
Child f()
Parent::g()
Parent::y()
LOOK HERE: 10

Parent::h()
Child f()
Parent::g()
Parent::y()
LOOK HERE: 10
*/ 
复制代码

 

首先Child继承了Parent中的 h()方法!
我们new 了一个Child类的对象XXX, 用ch指向了它!
当ch去调用h()方法的时候,好了关键的问题来了,那就是此时的this指针到底是指向谁的....

要知道,this指针是和对象相关的,所以无论怎样,那么调用h()方法的是XXX这个对象,
那么this就是指向XXX这个对象XXX!在入栈的时候,this也一同被压入!既然this是指向XXX
的,为什么会调用基类的g()方法呢?然后又调用的是派生类中的f()方法呢?(注意:g()方法
和f()方法在基类和派生类中都有).....

仔细看一下,是不是感觉和派生类向上转型为基类的多态差不多啊。子类在调用h()方法时,其实
默认将this的类型进行了向上提升,也就是由Child* this -> Parent* this;想一想这是必须的,
why?因为h()只是派生类继承基类的,并没有进行重写!如果没有进行this的类型提升,那么
如果h()方法中存在对基类私有成员的访问,比如这个子类中的y()方法是私有的!h()中调用了
y(); 也就是this->y();是不是矛盾了?派生类中怎么可以访问基类中的私有成员呢???

所以this的类型一定向上提升了!
如果还是不信,那你看一下 样例2 中的x值是不是输出的是基类中的 x 的值!
再看一看 样例3中的输出是不是和样例2的输出时一样的!从f()的调用和g()调用
可以看出是多态的结果...










本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3963320.html,如需转载请自行联系原作者
目录
相关文章
|
14天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
21天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
21天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
19 4
|
21天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
28 1
|
22天前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
15 0
|
27天前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
1月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)