非虚拟函数与虚拟函数的区别(读《深入浅出MFC》第三章MFC六大关键技术之仿真Frame2有感):
来源:互联网 发布:it著名培训学校 编辑:程序博客网 时间:2024/05/21 09:29
1.当由指针调用由子类(或某一个类)实例化的对象时(不管此指针是指向谁的那个类型的,只要合法),当指针调用此对象中的函数时(不管是子类中添加的还是由父类继承来的),如果此函数是非虚拟函数,则首先在那个类中寻找这个函数,若找不到则依次向父类中寻找,直至找到(如果找不到,那此程序就出错了,呵呵),但不会向下向子类中寻找;如果此函数是虚拟函数,则就要严重关注此实例化对象,不管是先前指针所指向的还是后来又实例化的,具体情况具体分析(废话)(依次严重关注调用函数所属于的实例化的对象),要在某类中调用某函数时要追本溯源,重新返回产生对象的那个类(可能是最后的子类),再依次向父类寻找(不要懒,呵呵),看看到底是属于哪个类的,而不要被函数所在的位置所迷惑,实际有可能要调用的函数在子类,本类或父类中。(注:如果调用函数的前面指明调用属于哪个类那个域的函数,没办法,只有调用那个类的了。如:CWinThread::Run(),只有调用CWinThread类中的Run()函数了)
附两个小程序以供参考调试:
a)非虚拟函数:
#include<iostream.h>
class CBase
{
public:
void Init()//virtual
{
cout << "CBase::Init()" << endl;
}
void fun()//virtual
{
cout << "CBase::fun()" << endl;
}
};
class CChild1 : public CBase
{
public:
void Init()//virtual
{
cout << "CChild1::Init()" << endl;
}
void fun()
{
cout << "CChild1::fun()" << endl;
}
};
class CChild2 : public CChild1
{
public:
void Init()//virtual
{
cout << "CChild2::Init()" << endl;
fun();
}
void fun()
{
cout << "CChild2::fun()" << endl;
}
};
class CChild3 : public CChild2
{
public:
CChild3()
{
Init();
}
void fun()
{
cout << "CChild3::fun()" << endl;
}
};
void main()
{
CChild3* m_pCurrent = NULL;
m_pCurrent = new CChild3;
}
输出:
CChild2::Init()
CChild2::fun()
b)虚拟函数:
#include<iostream.h>
class CBase
{
public:
void Init()//virtual
{
cout << "CBase::Init()" << endl;
}
virtual void fun()//
{
cout << "CBase::fun()" << endl;
}
};
…………………
……………………//下面完全跟非虚拟函数的相同,二者区别只是在虚拟函数中的类CBase中fun()函数前加了一个virtual关键字而已。
输出:
CChild2::Init()
CChild3::fun()
-------------------------------------------------------------------------
- 非虚拟函数与虚拟函数的区别(读《深入浅出MFC》第三章MFC六大关键技术之仿真Frame2有感):
- 深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建) .
- 深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:消息映射)
- 深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:命令传递) .
- 深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建)
- 深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建) .
- 深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:消息映射)
- 深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:命令传递) .
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之MFC程序的初始化过程
- MFC六大关键技术之仿真(一)
- 3.MFC六大关键技术之仿真(深入浅出MFC之读书笔记)
- MFC六大关键技术仿真
- 学习笔记之深入浅出MFC 第8章 C++重要性质----虚拟函数与多态(Polymorphism)
- 《深入浅出MFC》_第3章 MFC 六大关键技术之仿真_Frame2 范例程序_输出分析
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之RTTI运行时类型识别
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之动态生成
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之永续生存
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之消息映射和消息流动
- 关于Session的一点认识
- 在公司蹭饭
- what kind of linuxer is wanted by companys?
- 手机斜角地图中A*算法的实用化
- [2006.10.17]今天开始停止更新本blog
- 非虚拟函数与虚拟函数的区别(读《深入浅出MFC》第三章MFC六大关键技术之仿真Frame2有感):
- RMAN backupset renaming or relocation
- 一些零碎VC知识
- 开发流程
- 基于JDBC的数据库连接池技术研究与应用
- 解读微软互联网新战略(上)
- Url用例名词
- 解读微软互联网新战略(下)
- asp.net中数据绑定的写法