zoukankan      html  css  js  c++  java
  • this指针

    孙鑫VC++教程,第三章中this指针

    开始自己写错了,然后google得来一个此提问。

    CTestAPP 由 CWinAPP 派生而来
    CWinApp::CWinApp(LPCTSTR lpszAppName) //带参数
    {
    ......
    pThreadState->m_pCurrentWinThread = this;
    //注意,这个this指针指向那个对象?是CWinAPP还是CTestAPP
    //孙老师说是指向派生类CTestAPP的对象,但是我的试验中却是指向基类对象啊
    ASSERT(AfxGetThread() == this);
    ......
    }
    我做的试验如下:
    #include <iostream.h>

    class Point
    {
    public:
    void output()
    {
    cout<<"调用了基类的output()函数.";
    }
    void cjp()
    {
    this->output();
    }
    };

    class test:public Point
    {
    public:
    void output ()
    {
    cout<<"调用了派生类的output函数。";
    }
    };

    void main()
    {
    test tt;
    tt.cjp();
    }

    采纳答案:
    ----------------------------------
    你所建的Test派生于父类Point,当VC在编译时,要确定每个对象调用的函数地址,即早期绑定,实际上在内存里tt是由父类Point和tt实际增加的内存部分组成,好比两块叠在一起的砖头,上面那块是父类Point,下面那块是tt,当你用tt调用cjp时,实际上已经静态联编了,即该对象是被认为是Point的对象所占的内存,当然会指向Point的Output.
    那么这个时候就得调用虚函数,因为在你的派生类和子类里都有Point的函数,所以在Point类里面的Output前增加virtual即可.这样就实现了运行时的多态.



    --------------------------------------
    没懂你的意思,不过你的程序里面派生类没有重写cjp函数,你调用的当然是基类中的cjp函数了,如果你想实现多态,要在基类中将cjp定义成虚函数,派生类里面再改写该函数,然后就可以用基类的指针指向派生类对象,实现派生类函数的调用了。



    --------------------------------------------
    基类的 output 函数没有定义为 virtual,派生类不是重写而是又定义了一个 output。
    在基类的 void output() 前面加上 virtual 就可以了。




    然后自己又写代码加深理解
     1 #include "stdafx.h"
     2 struct member
     3 {
     4     member()
     5     {    
     6         printf("member ctor
    ");
     7     }    
     8 };
     9 class Parent
    10 {
    11 public:
    12     Parent()
    13     {
    14         printf("parent ctor
    ");
    15         p =this;
    16     }
    17 
    18     virtual void education()
    19     {
    20         printf("parent education
    ");
    21     }
    22     static Parent * p;
    23     static member m;
    24 };
    25 
    26 class Children: public Parent
    27 {
    28 public:
    29     Children()
    30     {
    31         printf("children ctor
    ");
    32     }
    33     void education()
    34     {
    35         printf("children learn");
    36     }
    37 };
    38 
    39 
    40 Parent * Parent::p = NULL;
    41 Children c;
    42 member mem;
    43 member Parent::m = member();
    44 int _tmain(int argc, _TCHAR* argv[])
    45 {    
    46     printf("main
    ");
    47     
    48     Parent::p->education();
    49     getchar();
    50     return 0;
    51 }
    View Code


    1 类的静态成员变量 与 类的实例对象 没有关系 (后面查找类和静态成员的关系?)
    2 不加virtual最后一行输出 parent education ,加上virtual最后一行输出 children learn (后面查找虚函数表?)

  • 相关阅读:
    u-boot器件驱动模型(Device&Drivers)之uclass (转)
    u-boot下的DM驱动模型 阶梯状 (转)
    u-boot-2018.09 DTS上 I2C节点的解析 (转)
    [uboot] (番外篇)uboot串口&console&stdio设备工作流程 (转)
    [uboot] (番外篇)uboot 驱动模型(转)重要
    u-boot DM初始化流程
    【u-boot】u-boot中initf_dm()函数执行流程(转)
    【u-boot】u-boot对设备树的节点解析(转)
    BeanPostProcessor
    一些压力测试结果(Mysql,Zookeeper,Redis,Mongodb)
  • 原文地址:https://www.cnblogs.com/kira2will/p/3589447.html
Copyright © 2011-2022 走看看