转载请标明是引用于 http://blog.csdn.net/chenyujing1234
有补充的,请大家指出!
在我的文章<<dynamic_cast报错 异常>>中讲到dynamic_cast、reinterpret_cast 、static_cast 在有继承关系类的转化中的作用,
现在分析一下在无它们情况下类的转化现象。
一、测试代码
#include <windows.h>
#include <stdio.h>
class CBase
{
public:
virtual void fun1()
{
printf("CBase::fun1\n");
}
void fun2()
{
printf("CBase::fun2\n");
}
};
class CDerive : public CBase
{
public:
void fun1()
{
printf("CDerive::fun1\n");
}
void fun2()
{
printf("CDerive::fun2\n");
}
};
int main()
{
CBase cbase;
CDerive cderive;
cbase.fun1();
cbase.fun2();
/*输出:
CBase::fun1
CBase::fun2
*/
// 报错: error C2679: 二进制“=”: 没有找到接受“CBase”类型的右操作数的运算符(或没有可接受的转换)
//cderive = (CDerive)cbase;
//cderive.fun1();
//cderive.fun2();
cbase = cderive;
cbase.fun1();
cbase.fun2();
/*输出:
CBase::fun1
CBase::fun2
*/
CBase *pCB = &cderive;
pCB->fun1();
pCB->fun2();
/*输出:
CDerive::fun1
CBase::fun2
// 总结:如果成员函数是virtual,那么当用指针强转时,不会产生函数指针覆盖;
// 而如果不是virtual,那么就会产生函数指针覆盖;
*/
CDerive *pCD = (CDerive*)&cbase;
pCD->fun1();
pCD->fun2();
/*输出:
CBase::fun1
CDerive::fun2
// 总结:如果成员函数是virtual,那么当用指针强转时,不会产生函数指针覆盖;
// 而如果不是virtual,那么就会产生函数指针覆盖;
*/
pCB = (CBase *)pCD;
pCB->fun1();
pCB->fun2();
/*输出:
CBase::fun1
CBase::fun2
*/
pCD = (CDerive *)pCB;
pCD->fun1();
pCD->fun2();
/*输出:
CBase::fun1
CDerive::fun2
*/
system("pause");
return 0;
}
二、运行结果