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.
C/C++ code

CDerived* pD3 = NULL;
pD3->test1();

------解决方案--------------------
探讨
能调的,只要不访问类成员(包括虚函数)就行。

------解决方案--------------------
探讨
感谢大家,明白了结果,但是大家能不能解释一下原因呢?
为什么不访问类成员(包括虚函数)就可以调用呢?

------解决方案--------------------
device指向的实际对象是ServerDevice当然没问题
------解决方案--------------------
探讨
大家再看一下这个代码
Device *device;
ServerDevice *server;//ServerDevice 继承了Device

GetDevice(&amp;device);//参数是(Device **)
server = dynamic_cast<ServerDevice *>(device);

这时server 不为空,也就是转换成功了
按照c++转换的……

------解决方案--------------------
函数指针独立于对象