c/c++语言开发共享C++关于指针,继承和多态介绍

目录指针指针和继承指针、继承和多态指针我们在书本上学到的指针基本上都是:首先,指针是一个变量;其次,这个变量存储的值是一个地址。这个是对指针的一个基本理解,最近在编程中发现了一些新的东西。首先,指针不

目录
  • 指针
  • 指针和继承
  • 指针、继承和多态

指针

我们在书本上学到的指针基本上都是:首先,指针是一个变量;其次,这个变量存储的值是一个地址。这个是对指针的一个基本理解,最近在编程中发现了一些新的东西。

首先,指针不仅仅是一个地址,还存在一个和所指向内容大小相关的值,如下代码:

#include<iostream>    using namespace std;    int main()  {      int a = 10;      int *pa = &a;      cout << "pa: " << pa << endl;      cout << "pa+1: " << pa + 1 << endl;        short b = 1;      short *pb = &b;      cout << "pb: " << pb << endl;      cout << "pb+1: " << pb + 1 << endl;        void *ppa = &a;      cout << "ppa:" << ppa << endl;      cout << "ppa+1: " << ppa + 1 << endl;        return 0;  }  

C++关于指针,继承和多态介绍

从运行结果可以看出pa+1,地址增加了4个字节;pb+1,地址增加了2个字节;ppa+1,地址增加了2个字节;而使用void指针指向整型变量a,此时ppa+1,地址只增加了1个自己。从这个结果我们可以很明显看出,指针不仅仅是一个存地址的变量,还存在一个和内存分配相关的值。其实进一步说,指针不仅仅是一个地址值,还存放着如何解释内存的规则。(void指针只存放地址,没有解释规则)

指针和继承

众所周知,继承可以实现用父类的指针来指向子类的对象,为什么可以这样用呢?正如上面所说,指针保存地址和解释内存的规则,当你声明一个父类指针,那么你就指明了该指针的解释规则,当你将子类地址传给指针时,你就相当于给了一块内存给这个指针,然后这个指针就可以用它的规则去解释这块内存。根据上面的说法,那么我们可以得出,子类对象中必定存在一块内存,其分配方式和父类对象一模一样(如果把这块内存单独提取出来,它就是一个父类对象),事实也是如此,而且这块“父类对象”一般都是存放在子类对象的最前面,这就解释了子类在构造的时候,一定会先调用父类构造函数。同时,“父类对象”指针只能访问自己的父类成员。那么考虑多继承的情况,多继承的子类,其内存空间中必定存在多个“父类对象”空间,这些父类空间的地址必定是不同的,那么就会造成同一个多继承的子类,用其不同的父类指针指向它,其地址值是不同的,实际测试的确如此:

#include<iostream>  using namespace std;  class a  {      public:          int a = 10;          long int aa = 100;  };    class b   {      public:          int b = 20;    };    class c : public a, public b  {      public:          int c = 30;  };    int main()  {      c c;      a *pa;      b *pb;      c *pc;        pa = &c;      pb = &c;      pc = &c;        cout << "pa: " << pa << endl;      cout << "pb: " << pb << endl;      cout << "pc: " << pc << endl;      cout << "pa.a: " << &(pa->a) << endl;      cout << "pa.aa: " << &(pa->aa) << endl;      cout << "pb.b: " << &(pb->b) << endl;      cout << "pc.c: " << &(pc->c) << endl;        return 0;  }  

C++关于指针,继承和多态介绍

C++关于指针,继承和多态介绍

其内存布局如图,pa、pb都指向各自的“父类对象”空间起始位置,pa只能访问a、aa,pb只能访问b(至于为什么a是int却占8个字节,这个和内存对齐有关,自行查询)。

指针、继承和多态

c++的继承和多态绕不过的一个东西便是虚指针和虚函数,这里简单说一下:首先,在含有虚函数的类中,会产生一个虚函数表,注意这个虚函数表是从属于类的,不是从属于对象,也就是多个对象共享这个虚函数表。其次,每个类声明的对象都会有一个虚指针,这个虚指针指向类的虚函数表。(这里只是简单提及一下,更多的东西可以自行查询)看过很多网上的东西,都说虚指针是每个对象的第一个数据成员,也就是分配在最开头的地址空间。其实,我觉得这句话不完全正确,因为当多继承中有虚函数时,虚函数表就有多个,虚指针也有多个,这些虚指针不一定全都存在于最开始的地址空间。应该说,这些虚指针存在于继承的父类所管理区域的开头:

#include<iostream>  using namespace std;  class a  {      public:          int a = 10;          long int aa = 10;          virtual void f()          {            }  };    class b   {      public:          int b = 20;          virtual void g()          {            }  };    class c : public a, public b  {      public:          int c = 30;          virtual void cc()          {            }  };    int main()  {      a *pa;      b *pb;      c c;      pa = &c;      pb = &c;      cout << pa << endl;      cout << &(pa->a) << endl;      cout << &(pa->aa) << endl;      cout << pb << endl;      cout << &(pb->b) << endl;      cout << &(c.c) << endl;        return 0;  }  

C++关于指针,继承和多态介绍

C++关于指针,继承和多态介绍

从上面的结果可以看出,虚指针不一定都是存在最开始的位置,如果硬要说是开始,应该也是相对于“父类对象”区域的开始。

到此这篇关于c++关于指针,继承和多态介绍的文章就介绍到这了,更多相关c++指针 继承 多态内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C++关于指针,继承和多态介绍,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1038188.html

(0)
上一篇 2022年1月26日
下一篇 2022年1月26日

精彩推荐