求教一个语句ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSDIDoc)));解决办法
求教一个语句ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSDIDoc)));
AppWizard生成的源代码如下:
CSDIDoc* CSDIView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CSDIDoc)));
return (CSDIDoc*)m_pDocument;
}
ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CSDIDoc)))的意思是不是:判断m_pDocument是否是CSDIDoc的子类,如果是则继续,否则中断。但是m_pDocument的类型不是CDocument*吗,怎么可能是CSDIDoc的子类呢??如果m_pDocument已经指向了CSDIDoc,那为什么还要做一个类型转换(CSDIDoc*)m_pDocument再返回呢?求教高人指点。
------解决方案--------------------
但是m_pDocument的类型不是CDocument*吗,怎么可能是CSDIDoc的子类呢??
=================
因为CSDIDoc重载了CDocument类,重新对m_pDocument赋值了。
为什么还要做一个类型转换(CSDIDoc*)m_pDocument再返回呢?
====================
因为m_pDocument指针的类型是定义为CDocument*的,不转换不行啊。
指针的类型和指针指向的对象的类型可以是不一样的,这就是指针的灵活性;但是这种灵活性是不安全的,因为可以随意转换,所以前面用一个ASSERT判断一下。我想只要把指针概念熟练掌握了,应该不难理解。
其实现在在C++中也可以使用安全的类型转换:static_cast、dynamic_cast等。
AppWizard生成的源代码如下:
CSDIDoc* CSDIView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CSDIDoc)));
return (CSDIDoc*)m_pDocument;
}
ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CSDIDoc)))的意思是不是:判断m_pDocument是否是CSDIDoc的子类,如果是则继续,否则中断。但是m_pDocument的类型不是CDocument*吗,怎么可能是CSDIDoc的子类呢??如果m_pDocument已经指向了CSDIDoc,那为什么还要做一个类型转换(CSDIDoc*)m_pDocument再返回呢?求教高人指点。
------解决方案--------------------
但是m_pDocument的类型不是CDocument*吗,怎么可能是CSDIDoc的子类呢??
=================
因为CSDIDoc重载了CDocument类,重新对m_pDocument赋值了。
为什么还要做一个类型转换(CSDIDoc*)m_pDocument再返回呢?
====================
因为m_pDocument指针的类型是定义为CDocument*的,不转换不行啊。
指针的类型和指针指向的对象的类型可以是不一样的,这就是指针的灵活性;但是这种灵活性是不安全的,因为可以随意转换,所以前面用一个ASSERT判断一下。我想只要把指针概念熟练掌握了,应该不难理解。
其实现在在C++中也可以使用安全的类型转换:static_cast、dynamic_cast等。