虚函数对于dynamic_cast转换的作用
为何使用dynamic_cast转换类指针时,需要虚函数呢。
Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继承关系等)。
如何在运行时获取到这个信息——虚函数表。
C++对象模型中,对象实例最前面的就是虚函数表指针,
通过这个指针可以获取到该类对象的所有虚函数,包括父类的。
因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系。
所以虚函数对于正确的基类指针转换为子类指针是非常重要的。
未定义虚函数时
#include "stdafx.h"
struct StBaseInfo
{
//virtual ~StBaseInfo() {}
int nID;
};
struct StExtendInfo : public StBaseInfo
{
int nAnything;
};
int main(int argc, _TCHAR* argv[])
{
StBaseInfo* pBaseInfo = new StExtendInfo;
StExtendInfo* pExInfo = static_cast<StExtendInfo*>(pBaseInfo);
delete pBaseInfo;
pBaseInfo = NULL;
return 0;
}
类内存布局
定义了虚函数
#include "stdafx.h"
struct StBaseInfo
{
//virtual ~StBaseInfo() {}
int nID;
};
struct StExtendInfo : public StBaseInfo
{
int nAnything;
};
int main(int argc, _TCHAR* argv[])
{
StBaseInfo* pBaseInfo = new StExtendInfo;
StExtendInfo* pExInfo = dynamic_cast<StExtendInfo*>(pBaseInfo);
delete pBaseInfo;
pBaseInfo = NULL;
return 0;
}
类内存布局
