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,如需转载请自行联系原作者
目录
相关文章
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
29 4
|
9天前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
24天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
1月前
|
存储 算法 搜索推荐
对二叉堆的简单分析,c和c++的简单实现
这篇文章提供了对二叉堆数据结构的简单分析,并展示了如何在C和C++中实现最小堆,包括初始化、插入元素、删除最小元素和打印堆的函数,以及一个示例程序来演示这些操作。
34 19
|
1月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
38 1
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
29 2
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4