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

来源:互联网 发布:阿里云 安全加固 编辑:程序博客网 时间:2024/06/08 15:04
以前对这个问题也没有太注意,今天碰到提出就想了想,给出以下解释
先看一个很简单的类
#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++中是允许父类对象指针指向派生类的对象的