派生类和基类指针的一些使用方法

来源:互联网 发布:虹吸壶 知乎 编辑:程序博客网 时间:2024/06/14 20:58

1.C++允许父类指针直接指向子类对象,也允许父类引用直接引用子类对象。但是子类指针不能直接指向父类对象。

示例代码1:

#include <iostream>class A{    int m;public:    int getv(){ return m;}    A(int x):m(x){}};class B:public A{    int n;public:    int getv(){ return n +A::getv();}    void prinfun(){ std::cout<<"Hello World!\n";}    B(int x):A(x){ n =x; }};int main(){    A *p =NULL;    B b(444);    p =&b;    std::cout<<p->getv()<<'\n';    std::cout<<((B*)p)->getv()<<'\n';//    p->prinfun(); error: 'class A' has no member named 'prinfun'    ((B*)p)->prinfun();    return 0;}
结果图示:


结果说明:

编译程序只能根据类型定义静态地检查语义。由于父类指针可以直接指向子类对象,而到底是指向父类对象还是子类对象只能在运行时确定,故编译时只能把父类指针指向的对象都当做父类对象。因此,在访问这些对象的书籍成员或函数成员时,不能超越父类对象为相应成员规定的访问权限。

2.如果基类和派生类没有构成父子关系,则普通函数定义的地基类不能直接指向派生类对象,而必须通过强制类型转换才能指向派生类对象。

示例代码2:

#include <iostream>class A{    int m;public:    int getv(){ return m;}    A(int x):m(x){}};class B: A{    int n;public:    int getv(){ return n +A::getv();}    void prinfun(){ std::cout<<"Hello World!\n";}    B(int x):A(x){ n =x; }};int main(){    A &p =*(A*)new B(444);//    A &p =new B(444);//error: invalid initialization of non-const reference of type 'A&' from an rvalue of type 'B*'    std::cout<<p.getv()<<'\n';    return 0;}
结果为:444

注意类和new结合的引用方法。
3.对于从基类A派生的类X的函数成员prin来说,无论类X的派生控制是private、protected还是public,prin定义的A类指针都可以直接指向类X的对象,prin定义的基类引用也可以直接引用类X的对象,也就是说,对于派生类函数成员来说,基类被等同地当做父类。

示例代码3:

#include <iostream>class A{    int a;};class X: A{    int b;public:    A *getp();    void prin(){ std::cout<< "Hello World!";}};A *X::getp(){    A *p =this;    A &q =*this;    return &q;}int main(){    A *p =0;    X x;    p =x.getp();    ((X*)p)->prin();    return 0;}

结果为屏幕输出Hello World


0 0
原创粉丝点击