前文:C++之继承探究(四):继承的使用

把子类对象当作父类对象使用

分三种情况:

  (1) 将子类对象赋值给父类对象。
   ——把等号右边的子类对象,赋值给等号左边的父类对象时,仅仅是把子类中来自于父类的那一部分成员,赋值给等号左边的父类对象,而赋值完成后,等号左边的对象,依然是父类对象。

  (2) 父类引用指向子类对象。
   ——子类对象用于初始化父类引用。

   ——将子类对象传递给参数为父类引用的函数;函数原型返回值类型为父类引用,而实际返回的是子类对象;父类引用指向子类对象时,当通过父类引用去调用被子类覆盖的函数时,父类版本的函数将被调用。

  (3) 父类指针指向子类对象。
   ——子类对象的地址赋值给父类指针。

   ——将子类对象(地址)传递给参数为父类指针的函数。

   ——函数原型返回值类型为父类指针,而实际返回的是子类指针。

注意:可以把子类对象当作父类对象使用,但不能把父类对象当作子类对象使用。

  可以把一个实际指向子类对象的父类指针,显示地转型为子类指针,就可以通过转型后的子类指针调用到子类版本的函数,这就是所谓的向下转型。然而向下转型是危险的,因为父类指针有可能并没有指向子类对象。

例1:

附例1代码:

//小问学编程
#include <iostream>
using namespace std;
class Point
{friend ostream& operator<<(ostream&, Point&);
public:Point (double xval =0, double yval=0 ) { x=xval; y=yval;};
public:void print(){cout <<" Point:X:Y: "<<x << "," <<y<< "\n";}
protected: // accessed by derived classdouble x;double y;
};
ostream& operator << (ostream& os, Point& apoint)
{os <<" Point:X:Y: "<<apoint.x << ","<< apoint.y<< "\n";return os;
}class Circle : public Point
{friend ostream& operator<<(ostream&,Circle&);
public:Circle (double r=0,double xval=0,double yval=0):Point(xval,yval){radius = r;};void print(){cout<< "Circle:radius:" <<radius<<endl;cout <<" Point:X:Y: "<<x << "," <<y<< "\n";}double area(){ return (3.14159* radius *radius);}
protected:double radius;
};
ostream& operator <<(ostream& os, Circle& aCircle)
{os<< "Circle:radius:" << aCircle.radius;os << (Point&)aCircle << "\n";return os;
}int main()
{Point p(2,3); cout <<"Point P= "<< p;Point pp(0,0); cout <<"Point PP= "<< pp;Circle c(7,6,5); cout <<"Circle c= "<< c; //radius =7pp = p;//同类对象的赋值cout <<"Point PP= "<< pp; //built in assign =//把子类对象赋值给父类对象pp = c; //legal; also assignment O.K.cout <<"Point PP= "<< pp;//先转型再赋值。向上转型是安全的。pp= (Point)c; // but better use the castcout <<"Point PP= "<< pp;//不能把父类对象,赋值给子类//c = (Circle) pp; //illegal Cannot convert 'class Point' to 'class//Circle'//c=pp; //illegal assignment not definedPoint* pPoint;pPoint = &c;//父类指针指向子类对象pPoint ->print(); //call base class print,调用父类版本((Circle*)pPoint)->print();//向下转型//(父类指针转型为子类指针)// Circle* pc = &pp;Point& r = c; //父类引用,指向子类对象r.print(); //调用父类版本print((Circle&)r).print();return 0;
}

运行结果:


例2:

附例2代码:

//小问学编程
#include <iostream>
using namespace std;
class Base
{public:void func( ) {cout << "Base class function.\n";}
};class Derived : public Base
{public:void func( ){cout << "Derived class function.\n";}
};void foo(Base & b)
{b.func(); //父类版本
}int main(int argc, const char * argv[]) {Derived d;Base b;Base* p = &d;Base& br = d;b = d;b.func( ); //父类版本d.func( ); //子类版本p->func( );//父类版本foo(d);br.func( );//父类版本return 0;
}

运行结果:

C++之继承探究(六):虚函数和多态

C++之继承探究(五):子类对象作父类对象使用相关推荐

  1. c 子类对象 访问父类对象受保护成员_面向对象三大特征: 继承

    如果子类重写了父类的方法,子类对象又要使用父类的方法怎么办 继承 今日内容 所有的类都直接或者简洁的集成到了Object Object:祖宗类 概述 要定义的类属于已有类的一种时,可以将该类定义为已有 ...

  2. c 子类对象 访问父类对象受保护成员_C++日志(三十四)子类同名成员与作用域分辨符...

    在继承中,如果子类新增成员和父类成员的名称相同,那么就需要辨别访问的是子类成员还是父类成员. 1.什么是作用域分辨符? C++中,作用域分辨符由"::"表示,其作用是限定所访问成员 ...

  3. c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象

    一.static 1.它是一种修饰符 2.使用位置:它用来修饰成员变量和成员方法 static修饰成员变量,叫类变量: static修饰成员方法,叫类方法: 类成员=类变量+类方法 没有使用stati ...

  4. c 子类对象 访问父类对象受保护成员_java面向对象总结

    前言:文章参考<java疯狂讲义>进行总结和归纳,知识要进行输出才算真正的有用. 在java的世界里,一切皆为对象,类是对对象的抽象,来一个例子:Person类 public 有了类,就可 ...

  5. c 子类对象 访问父类对象受保护成员_面向对象的三大特征

    1.封装 封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 封装的好处: 良好的封装可以减少耦合. 类内部的实现可以自由修改. 类具有 ...

  6. c 子类对象 访问父类对象受保护成员_看了这个,你就会搞对象了

    今天我们来聊聊面向对象的一些事情. 什么是面向对象?简单的来讲,面向对象是一种程序设计的思想,一种分析和解决问题的方式.如果说世间每一个事物,都是一个独一无二的个体,那么这个个体就是一个对象--你的女 ...

  7. java子类引用指向父类对象_java 中父类引用指向子类对象时

    继承和方法重写已经很熟悉了,这次 主要验证一下,当一个父类的引用指向一个对象的时候,它会调用子类的方法,而不是父类的. 引用在栈内存中存在对象的内存地址.真正的对象(通过 new Student()创 ...

  8. java子类引用指向父类对象_Java多态 父类引用指向子类对象

    Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father  c  =  new  Child()    在c的 ...

  9. c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)

    这节讲一下,什么是面向对象(Object Oriented Programming).说面向对象之前,我们不得不提的是面向过程(Process Oriented Programming),C语言就是面 ...

最新文章

  1. android省市二级联动的实现
  2. nanopi磁盘烧写
  3. 中国大学MOOC 计算机组成原理第3章 测试
  4. idea conf文件_JavaWe商品项目保姆级解析IDEA版(配置篇)
  5. 图像质量评价之数据库
  6. python sorted下标_Python列表操作最全面总结
  7. 基于javaweb jsp+servlet学生宿舍管理系统
  8. error C2143: syntax error : missing ‘;’ before ‘type’
  9. 3d激光雷达开发(生成RangeImage)
  10. IE8 新增的Javascript,css功能
  11. 基础总结篇之三:Activity的task相关
  12. php无法写入json,php json解析不出来怎么办
  13. 编译telepresence:没有规则可制作目标“tinywrap/ActionConfig.cxx”,由“telepresence-ActionConfig.o” 需求。
  14. win10相机打不开,显示错误代码0xA00F4246(0x800706D9)
  15. 数据库中的数据模型 概念数据模型、逻辑数据模型、物理数据模型
  16. 社区电商平台有哪些运营模式
  17. kubectl命令补全
  18. Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference
  19. 你应该了解的工厂方法模式:优雅的代码永不过时
  20. 【详细教程】App inventor连接阿里云平台(APP显示STM32发来的温湿度数据等)

热门文章

  1. 对HTTPCONNECTION的理解
  2. php 实现数组转json数据结构,php怎么实现数组转json
  3. python 内存溢出能捕获吗_Python内存泄漏和内存溢出的解决方案
  4. MySQL可以用localhost 连接,但不能用IP连接的问题
  5. 转载(面向对象设计的原则)
  6. 关于input输入框内设置小图标的问题
  7. poj 3252 Round Numbers(数学)
  8. JAVA GUI THREAD---***
  9. bzoj3594 [Scoi2014]方伯伯的玉米田
  10. jquery.eq()