为什么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++中是允许父类对象指针指向派生类的对象的
 

相关文章推荐

派生类的构造函数

转自:http://www.cnblogs.com/surpercore/archive/2008/10/24/1318941.html   派生类的数据成员由所有基类的数据成员与派生类新增的数据...

第十周任务一(派生类构造函数的定义应用 )

/*(程序头部注释开始) 程序的版权和版本声明部分 Copyright (c) 2011, 烟台大学计算机学院学生 All rights reserved. 文件名称: C...

派生类和他的构造函数们

派生类与构造函数

C++派生类的构造函数

用户在声明类时可以不定义构造函数,系统会自动设置一个默认的构造函数,在定义类对象时会自动调用这个默认的构造函数。这个构造函数实际上是一个空函数,不执行任何操作。如果需要对类中的数据成员初始化,应自己定...

【C++】继承时的名字遮蔽&&派生类的构造函数

如果派生类和基类中的成员相同,会发生什么情况呢?  如果派生类和基类的成员变量或者成员函数相同,那么就会遮蔽从基类继承来的成员函数或者成员变量,即使用新增的成员变量,而不是使用继承来的。/******...

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

近期在网上搜寻了一下关于C++派生类构造函数的调用问题,大部分博文给出的顺序是: 1、基类构造 2、成员构造 3、派生构造。 这个顺序严格来讲是错误的,对新手极具误导性!     依据侯捷翻译...

C++课本例题(派生类的构造函数)

#include #include using namespace std; class Student //声明基类Student { public: Student(int n,string ...

关于C#中派生类调用基类构造函数的理解[转]

写的非常细 本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1、  当基类中没有自己编写构造函数时,派生类默认的调用基类的默认构造函数 Ex:  ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么CWinApp构造函数中的this是指向派生类的
举报原因:
原因补充:

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