为什么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++中是允许父类对象指针指向派生类的对象的
先看一个很简单的类
#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++中是允许父类对象指针指向派生类的对象的
- 为什么CWinApp构造函数中的this是指向派生类的
- CWinApp类构造函数定义的解释
- MFC,基类构造函数THIS指针指向的是子类
- 为什么基类指针指向派生类是安全的,而派生类指向基类则是不安全的
- this 指向二-----构造函数的this指向
- 有没有virtual的构造函数? 子类如何调用父类的构造函数? 用CWinApp派生类如何构造程序对象?
- CWinApp的构造函数(摸索)
- MFC CWinApp派生类中使用CFrameWnd派生类的成员函数Create来创建窗口
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- 派生类的构造函数
- Java学习:IO(1)
- flash读取外部txt文件
- 在VC中利用UDL文件建ADO连接
- Sql Server 2000 安装挂起问题
- 国庆节的前一天,保研复试顺利过关
- 为什么CWinApp构造函数中的this是指向派生类的
- 质量保证的六个模式(1) - 质量价值简介
- 四阶素数幻方问题
- 【原创翻译】COM入门简介 -- 什么是COM , 怎样使用它 (2)
- 设计模式之Singleton(单态)
- vim高级使用
- HTTP协议的头信息详解
- vim的初级使用
- 数据结构(java)练习1