基类和派生类指针的相互赋值和转换
int main() { CDerived objDerived(3); CBase objBase(5); CBase * pBase = &objDerived; // 使得基类指针指向派生类对象 //pBase->Func(); //错, CBase类没有Func()成员函数 //pBase->v = 5; //错 CBase类没有v成员变量 pBase->Print();//可以访问自己有的部分 cout << "1)------------" << endl; //CDerived * pDerived = & objBase; //错,不能将基类指针赋值给派生类指针 CDerived * pDerived = (CDerived *)(&objBase); pDerived->Print(); //慎用,可能出现不可预期的错误 cout << "2)------------" << endl; objDerived.Print(); cout << "3)------------" << endl; pDerived->v = 128; //往别人的空间里写入数据,会有问题 objDerived.Print(); return 0; }
具体类内容我就不写了,这个是抄别人的http://c.biancheng.net/view/260.html
但是这里补充一个问题,为什么
pBase->Func(); //错, CBase类没有Func()成员函数 这个基类访问不了派生类的成员函数呢,
其实简单来说pbase只能访问自己有的那部分,没有那部分是访问不了的,往深的讲
在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间。
当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素。
于是基类的指针就可以访问到基类也有的元素了,但是此时无法访问到派生类(就是N之后)的元素。
年轻人要讲武德,好自为之.