c++之类指针的关系

1基类指针和派生类指针与基类对象和派生类对象4种可能匹配:

   直接用基类指针引用基类对象;

   直接用派生类指针引用派生类对象;

  用基类指针引用一个派生类对象;

  用派生类指针引用一个基类对象。

2.基类指针引用派生类对象

例如:

A    * p ;  // 指向类型 A 的对象的指针

A    A_obj ;  // 类型 A 的对象

B    B_obj ;  // 类型 B 的对象

p = & A_obj ;  // p 指向类型 A  的对象

p = & B_obj ;  // p 指向类型 B  的对象,它是 A 的派生类

  利用 p,可以通过 B_obj 访问所有从 A 类继承的元素 ,

  但不能用 p访问 B 类自定义的元素 (除非用了显式类型转换)

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4
 5
 6 //使用基类指针引用派生类对象
 7 class A
 8 {
 9     char name[20];
10 public:
11     void setName(char* s)
12     {
13         strcpy_s(name,s);
14     }
15     void print()
16     {
17         cout << "name = " << name << endl;
18     }
19 };
20
21 class B:public A
22 {
23         char phone_num[20];
24 public:
25     void setNum(char* num)
26     {
27         strcpy_s(phone_num,num);
28     }
29     void printNum()
30     {
31         cout << "phone_num = " << phone_num << endl;
32     }
33 };
34
35 void main()
36 {
37     //基类指针
38     A* ap;
39     //基类对象
40     A a;
41     //派生类对象
42     B b;
43     //基类指针指向基类对象
44     ap = &a;
45     //使用基类指针调用基类的成员函数
46     ap->setName("tangxiaoxue");
47     ap->print();
48     //基类指针指向派生类对象
49     ap = &b;
50     //使用基类指针调用从基类继承的成员函数
51     ap->setName("dujingui");
52     ap->print();
53     //使用派生类对象调用派生类的成员函数
54     b.setNum("15110711517");
55     //对基类指针进行强类型转换,调用派生类的成员函数
56     ((B*)ap)->printNum();
57 }

3.派生类指针引用基类对象

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Data
 5 {
 6 public:
 7     Data(int y,int m,int d)
 8     {
 9         setData(y,m,d);
10     }
11     void setData(int y,int m,int d)
12     {
13         year = y;
14         mouth = m;
15         day = d;
16     }
17     void print()
18     {
19         cout << year << "-" << mouth << "-" << day << ";";
20     }
21 protected:
22     int year,mouth,day;
23 };
24
25 class DataTime:public Data
26 {
27 public:
28     DataTime(int y,int m,int d,int h,int mi,int s):Data(y,mi,d)
29     {
30         setTime(h,mi,s);
31     }
32     void setTime(int h,int m,int s)
33     {
34         hours = h;
35         minutes = m;
36         second = s;
37     }
38     void print()
39     {
40         //对this指针做类型转换,调用基类的成员函数
41         //((Data*)this)->print();等价于Data::print()
42         Data::print();
43         cout << hours << ":" << minutes << ":" << second << endl;
44     }
45 private:
46     int hours,minutes,second;
47 };
48
49 void main()
50 {
51     DataTime d(1995,12,14,12,14,16);
52     d.print();
53 }
时间: 2024-10-29 19:07:01

c++之类指针的关系的相关文章

c/c++(疑4) 指针数组和数组指针之间关系

 1 指针数组和数组指针概述(数组指针(指向数组的指针)与指针数组(存放指针的数组)) 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是"储存指针的数组"的简称. 数组指针:首先它是一个指针,它指向一个数组.在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.它是"指向数组的指针"的简称. 认识指针数组和数组指针从内存方面分析 1 int *ptr1[5]; 2 int (*ptr2)[5]; 要分析上面的问题

数组变量和指针的关系

老师说数组变量可以被看作是const的指针变量,到底是"可以被看作",还是"就是"指针呢? 用程序证据来说明你的观点. (提示:如果对const指针的所有的操作都可以对数组变量做,而且结果一致,就说明数组变量就是指针:如果有某个操作不能做,或者结果不一致,就说明不是指针) #include <stdio.h> int main(){ int a[] = {1,1,2,3,4,5,6,7,8,9,0,}; int *const p = &a[0];

二维数组中数组名与其指针的关系

大多数初学者不是很清楚二维数组是个怎样的存在,今天我就来说说这个二维数组,计算机内存是一连串的存储单元,我们可以把它理解成一条线,没错就是一条线,那么问题来了,二维是个怎样的存在呢???说白了,二维数组并不真是二维,只是人们主观的将它变成二维,举个例子吧!比如楼梯,我们都知道楼梯说白了就是一条路,但是我们刻意将楼梯来回上升的方式,这都是我们主观的改变,实际上我们可以看成是一个直路,只是被工人弄弯了.好了,不扯了,进入主题.... 二维数组名a是数组第一行的指针,它指向的是一整行,*a才是a[0]

你必须知道的指针基础-2.指针的声明和使用及数组和指针的关系

一.计算机知道数据类型吗? 1.1 神奇的数据类型 At first,计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中.But,内存角度没有数据类型,只有二进制:数据以字节(8位二进制)为单位存取.不同数据类型占据不同的字节,例如在32位系统中:int 为4个字节,short为2个字节(下面如未特殊声明,均为32为系统环境下的说明).下面我们看看int类型.short类型和double类型的数字分别在内存中如何存储: ①int类型:99999 由于int类型占4个字节,每个字节

二维数组和数组指针的关系

昨天既然写了一些关于数组指针的话题,那么今天就写一些关于数组指针的话题吧! 数组指针:这样读 数组的指针 , 即指向数组的指针,就是数组指针,其本质就是一个指针 比如:int (*a)[3];就是一个数组指针,运用如下 #include <stdio.h> #include <string.h> #include <stdlib.h> int main { int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; int (*b)[3]; int

积累的数组和指针的关系

C/C++的数组和指针基本等价,但也有细微的不同. 可以把数组名直接赋值给指针,也可以用数组第一个元素的地址给指针赋值 double a[5]={2,4,6,9,23}; short stdd[2]={3,5}; double * c = a; short *d = &stdd[0]; 指针变量+1 = 指向数组中第二个元素,如c=c+1,c[0]=4; 对指针操作就像对数组一样 *(c+1) = c[1] = a[1] 用sizeof用于数组得到的是整个数组的长度(字节数),sizeof用于指

数组和指针的关系

数组名本身就是地址或指针值,数组和指针都可以通过下标来访问.尽管指针和数组在访问内存的方式上几乎是相同的,但它们还是有区别的.指针变量可以取不同的地址作为它的值,但数组本身就是个地址,它是固定的. 假设a是个数组,i是个int变量.有一个基本的事实是: a[i] 相当于 *(a + i) 表达式a[i]的值就是数组第i个元素(从0开始计数)的值,而*(a + i)是对表达式a + i进行解引用.后者是个指针表达式,指向a之后的第i个元素的位置. 这意味着我们可以在指针中使用数组记法. 当一个数组

c++的引用与指针的关系详解

[TOC]#1.引用的概念及用法概念:引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.     温馨提示:引用不是定义一个新的变量定义的格式为:    类型 &引用变量名 = 已定义过的变量名;用法:举个例子: int a = 5; int& b = a; 这就是引用,b引用a,b是a的别名. #2.引用做参数我们在C语言中经常用指针做参数: Func(int *a) ; int main() { int arr[1000]; Func(arr); } 像这种情况

c语言中多维数组和指针的关系

如图: 执行结果: 说明:由执行结果可知,三个输出的结果相等(可能在不同的平台执行结果不相同,但三个的结果是相等的),数组multi的地址与数组multi[0]的地址相同,都等于存储的第一个整数的地址(multi[0][0])