zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    手写PE文件(不借助编译器,用十六进制数进行编写)
    浅谈代码段加密原理(防止静态分析)
    PE文件动态加载执行过程
    静态数据连接库(.lib)和动态连接库(.dll)
    关于普通断点/内存断点/硬件断点
    x64dbg零基础使用教程
    HOOK相关原理与例子
    socket,实现服务器和客户端对话
    解析PE文件
    python正则表达式---基于re模块
  • 原文地址:https://www.cnblogs.com/Smart-Du/p/4336152.html
Copyright © 2011-2022 走看看