c++ 父类转换成子类后指针为NULL,竟然还能调用子类函数解决方法
c++ 父类转换成子类后指针为NULL,竟然还能调用子类函数
#include <iostream>
using namespace std;
class CBasic
{
public:
virtual int test() {cout<<"basic test"<<endl;return 0;}
};
class CDerived : public CBasic
{
public:
virtual int test() {cout<<"derived test"<<endl;return 1;}
int test1() { cout<<"derived test1"<<endl;return 2;}
};
int main()
{
CBasic * pB1 = new CBasic;
CBasic * pB2 = new CDerived;
//dynamic cast failed, so pD1 is null.
CDerived * pD1 = dynamic_cast<CDerived * > (pB1);
cout<<"pD1="<<pD1<<endl; //输出结果为0
if(pD1 == NULL)
{
cout<<"11111111111111111111"<<endl;
}
pD1->test1();
//dynamic cast succeeded, so pD2 points to CDerived object
CDerived * pD2 = dynamic_cast<CDerived * > (pB2);
pD2->test();
return 0;
}
执行结果:
pD1=0
11111111111111111111
derived test1
derived test
这里明明pD1为NULL,但是还能调用函数test1(),不知这是为什么?
但是使用pD1->test(),调用虚汗数test(),就会出现段错误?
这是怎么回事?
谢谢
------解决方案--------------------
能调的,只要不访问类成员(包括虚函数)就行。
------解决方案--------------------
直接进一个空的CDerived*指针,也能调用test1.
#include <iostream>
using namespace std;
class CBasic
{
public:
virtual int test() {cout<<"basic test"<<endl;return 0;}
};
class CDerived : public CBasic
{
public:
virtual int test() {cout<<"derived test"<<endl;return 1;}
int test1() { cout<<"derived test1"<<endl;return 2;}
};
int main()
{
CBasic * pB1 = new CBasic;
CBasic * pB2 = new CDerived;
//dynamic cast failed, so pD1 is null.
CDerived * pD1 = dynamic_cast<CDerived * > (pB1);
cout<<"pD1="<<pD1<<endl; //输出结果为0
if(pD1 == NULL)
{
cout<<"11111111111111111111"<<endl;
}
pD1->test1();
//dynamic cast succeeded, so pD2 points to CDerived object
CDerived * pD2 = dynamic_cast<CDerived * > (pB2);
pD2->test();
return 0;
}
执行结果:
pD1=0
11111111111111111111
derived test1
derived test
这里明明pD1为NULL,但是还能调用函数test1(),不知这是为什么?
但是使用pD1->test(),调用虚汗数test(),就会出现段错误?
这是怎么回事?
谢谢
------解决方案--------------------
能调的,只要不访问类成员(包括虚函数)就行。
------解决方案--------------------
直接进一个空的CDerived*指针,也能调用test1.
- C/C++ code
CDerived* pD3 = NULL; pD3->test1();
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
device指向的实际对象是ServerDevice当然没问题
------解决方案--------------------
------解决方案--------------------
函数指针独立于对象