基类和派生类指针的相互赋值和转换

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之后)的元素。
posted @ 2021-06-07 21:45  wrjhzou  阅读(257)  评论(0编辑  收藏  举报