派生类和基类指针的一些使用方法
来源:互联网 发布:虹吸壶 知乎 编辑:程序博客网 时间: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
- 派生类和基类指针的一些使用方法
- 基类指针和派生类指针的使用总结
- 基类指针和派生类指针
- 继承 基类和派生类指针
- 派生类和指针数组
- 基类指针、派生类指针指向基类对象和派生类对象的4种方式
- 基类的指针和派生类的指针本质的区别
- 基类函数的this指针和派生类函数的this指针
- 基类指针和派生类指针的使用总结(二)
- 基类指针与派生类指针的相互转换
- 基类指针、派生类指针与他们的关系
- 基类指针、派生类指针与他们的关系
- 基类指针与派生类指针的相互转换
- 基类指针与派生类指针的相互转换
- 基类指针与派生类指针的相互转换
- 若使用基类指针delete派生类对象,需将基类和派生类的析构函数声明为virtual
- 用基类指针创建的派生类对象,从而无法访问派生类对象的数据和成员
- 用基类指针创建的派生类对象,无法访问派生类对象的数据和成员
- 书读百遍,其义自现
- 简单编程(十)搬砖问题
- C4.5算法的流程和程序分析
- 过山车(杭电2063)
- bluedroid discover 超时设置
- 派生类和基类指针的一些使用方法
- 五子棋----1
- 研发团队管理之一:团队成员管理
- NVL,NVL2,NULLIF,COALESCE
- Ubuntu14.04下安装Hadoop2.4.0 (单机模式)
- Codeforces Round #275 (Div. 2)B——Friends and Presents
- One Class SVM, SVDD(Support Vector Domain Description)
- 冷艳性感美女
- [转]为什么在12306买火车票要装根证书?