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++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
25 2
|
20天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
54 5
|
26天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
56 4
|
27天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
65 4
|
28天前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
2月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
28 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
25 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
23 1
|
2月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
17 0