为什么CWinApp构造函数中的this是指向派生类的

原创 2007年10月01日 16:55:00
以前对这个问题也没有太注意,今天碰到提出就想了想,给出以下解释
先看一个很简单的类
#include<iostream.h>

class Dog
{
public:
    Dog( )
    {
        m_age = 1;
    }
private:
    int m_age;
};

class LoveDog: public Dog
{
public:
    LoveDog( )
    {
        m_food = 10;
    }
        void SetFood( )
        {
                m_food = 100;
        }
private:
    int m_food;
};
//LoveDog dog;
int main( )
{
    Dog* pDog;
    LoveDog loveDog;
    cout<<"loveDog = "<<&loveDog<<endl;
    pDog = &loveDog;
    return 0;
}

应该知道类的成员函数(当然静态成员函数除外)都有一个隐藏参数,这个参数就是this指针,它指向
类对象本身。比如LoveDog的SetFood成员函数,它实际的样子应该是void SetFood( LoveDog* this )
当我们通过类对象调用SetFood时,就会用类对象去初始化this 指针,正因有了这个初始化,所以我们
在非静态成员函数内部才可以用this 否则 this 哪来的呢??
知道了这个this,下面就来说说关心的问题
Dog* pDog;
LoveDog loveDog;
pDog = &loveDog;
对上面的代码应该不会太陌生,在C++中是允许父类对象指针指向派生类的,这在学虚函数时碰到过。
既然LoveDog派生自Dog,那它肯定继承了Dog的相关属性,所以loveDog的成员分为两部分,一个是自己新
添加的,而另一个则是从Dog类继承的。而这里的pDog就是指向loveDog里从Dog继承下来的东东。
当构造一个派生类对象时,首先会先构造父类的对象。因此构造LoveDog loveDog时,会先构造Dog对象
还记得上面说的隐藏参数this 吗?父类的构造函数实际应该是这个样子:
Dog( Dog* this )
{
}
实际上在构造LoveDog loveDog时会:Dog* this = &loveDog;//注意这里
因此Dog构造函数里的this实际上是指向派生类LoveDog的对象loveDog,但它所包含的成员当然就都是从
Dog继承下来的成员。你可以在Dog(){}中加断点调试看看此时 this的内容。
如果看到这里一切都明白的话,那么为什么CWinApp中的this 是指向 CTestApp的对象。
其实:CWinApp的构造函数应该这样
CWinApp(LPCTSTR lpszAppName, CWinApp* this )//第二个this参数实际上是隐藏的

调用时: CWinApp* this = &theApp;即下面的样子
CWinApp::CWinApp( LPCTSTR lpszAppName, &theApp );
因此如果你知道有那么一个隐藏参数 this的话,那么问题的答案就一句话

在C++中是允许父类对象指针指向派生类的对象的
 

?第三讲中孙老师提到的this指针到底指向基类对象还是派生类对象?

在第三讲中,孙老师说基类中使用的this指针在派生类生成的对象当中,是指向派生类对象的,可是我按他说的方法去测试一下,结果是指向基类对象,这是为什么?   CTestAPP 由 CWinAPP 派生而...
  • teshorse
  • teshorse
  • 2006年07月25日 09:37
  • 2043

消息机制和指针获取与操作

MFC是Win API与C++的结合,API,即微软提供的WinDOS下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一...
  • holandstone
  • holandstone
  • 2012年04月16日 13:21
  • 2780

为什么要用基类指针指向派生类对象?

在基类与派生类之间,有一个规定:派生类对象的地址可以赋给指向基类对象的指针变量(简称基类指针),即基类指针也可以指向派生类对象。为什么有这一规定呢?因为它可以实现多态性【1】,即向不同的对象发送同一个...
  • FlyingBird_SXF
  • FlyingBird_SXF
  • 2014年11月21日 21:29
  • 1793

C#中关于派生类的构造函数的一些理解

看了C#高级编程第四版中的“派生类的构造函数”一节,感觉头昏脑胀的,但后来自己写了两个类(一个做父类,一个做子类),对他们构造函数进行一系列更改,发现:                  1、在父类中...
  • liuzhenpolestar
  • liuzhenpolestar
  • 2010年08月21日 10:17
  • 4386

派生类构造函数的定义和使用举例

1.派生类构造函数的一般形式为:派生类构造函数名(总参数表):基类构造函数名(参数表){   派生类中新增加数据成员初始化语句}2.在建立一个对象时,执行构造函数的顺序是:a.派生类构造函数先调用基类...
  • yanxiaolx
  • yanxiaolx
  • 2016年05月29日 13:43
  • 3456

派生类的构造函数的初始化列表问题

一、派生类不能在成员初始化列表中直接初始化基类的成员 初始化基类成员 构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的...
  • libaineu2004
  • libaineu2004
  • 2014年02月20日 17:47
  • 7332

关于c++中派生类构造函数初始化基类的记录

本人初学c++ 这篇东西类似于学习日记,用于日后回顾,有什么错误的认识也麻烦大家指正。 附上代码 #include using namespace std; class father{  ...
  • qq_23136451
  • qq_23136451
  • 2014年12月19日 17:18
  • 926

关于基类和派生类的构造函数和析构函数的执行顺序问题

C++ 派生类的析构函数的调用顺序为: A)  基类、派生类和对象成员类的析构函数  B)  派生类、对象成员类和基类的析构函数  C)  对象成员类、派生类和基类的析构函数     D)  ...
  • dyx810601
  • dyx810601
  • 2016年08月02日 20:53
  • 3634

C++中派生类构造函数解析

简单的继承方式 class parent { } class son:public parent { } 上面的代码完成了下面的工作: 派生类对象存储了基类的数...
  • Sun19910114
  • Sun19910114
  • 2014年10月02日 10:51
  • 452

关于C++派生类中构造函数调用顺序的问题

近期在网上搜寻了一下关于C++派生类构造函数的调用问题,大部分博文给出的顺序是: 1、基类构造 2、成员构造 3、派生构造。 这个顺序严格来讲是错误的,对新手极具误导性!     依据侯捷翻译...
  • mouyun1115
  • mouyun1115
  • 2015年07月02日 13:44
  • 948
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么CWinApp构造函数中的this是指向派生类的
举报原因:
原因补充:

(最多只允许输入30个字)