C++之继承探究(五):子类对象作父类对象使用
前文: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++之继承探究(五):子类对象作父类对象使用相关推荐
- c 子类对象 访问父类对象受保护成员_面向对象三大特征: 继承
如果子类重写了父类的方法,子类对象又要使用父类的方法怎么办 继承 今日内容 所有的类都直接或者简洁的集成到了Object Object:祖宗类 概述 要定义的类属于已有类的一种时,可以将该类定义为已有 ...
- c 子类对象 访问父类对象受保护成员_C++日志(三十四)子类同名成员与作用域分辨符...
在继承中,如果子类新增成员和父类成员的名称相同,那么就需要辨别访问的是子类成员还是父类成员. 1.什么是作用域分辨符? C++中,作用域分辨符由"::"表示,其作用是限定所访问成员 ...
- c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象
一.static 1.它是一种修饰符 2.使用位置:它用来修饰成员变量和成员方法 static修饰成员变量,叫类变量: static修饰成员方法,叫类方法: 类成员=类变量+类方法 没有使用stati ...
- c 子类对象 访问父类对象受保护成员_java面向对象总结
前言:文章参考<java疯狂讲义>进行总结和归纳,知识要进行输出才算真正的有用. 在java的世界里,一切皆为对象,类是对对象的抽象,来一个例子:Person类 public 有了类,就可 ...
- c 子类对象 访问父类对象受保护成员_面向对象的三大特征
1.封装 封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 封装的好处: 良好的封装可以减少耦合. 类内部的实现可以自由修改. 类具有 ...
- c 子类对象 访问父类对象受保护成员_看了这个,你就会搞对象了
今天我们来聊聊面向对象的一些事情. 什么是面向对象?简单的来讲,面向对象是一种程序设计的思想,一种分析和解决问题的方式.如果说世间每一个事物,都是一个独一无二的个体,那么这个个体就是一个对象--你的女 ...
- java子类引用指向父类对象_java 中父类引用指向子类对象时
继承和方法重写已经很熟悉了,这次 主要验证一下,当一个父类的引用指向一个对象的时候,它会调用子类的方法,而不是父类的. 引用在栈内存中存在对象的内存地址.真正的对象(通过 new Student()创 ...
- java子类引用指向父类对象_Java多态 父类引用指向子类对象
Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father c = new Child() 在c的 ...
- c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)
这节讲一下,什么是面向对象(Object Oriented Programming).说面向对象之前,我们不得不提的是面向过程(Process Oriented Programming),C语言就是面 ...
最新文章
- android省市二级联动的实现
- nanopi磁盘烧写
- 中国大学MOOC 计算机组成原理第3章 测试
- idea conf文件_JavaWe商品项目保姆级解析IDEA版(配置篇)
- 图像质量评价之数据库
- python sorted下标_Python列表操作最全面总结
- 基于javaweb jsp+servlet学生宿舍管理系统
- error C2143: syntax error : missing ‘;’ before ‘type’
- 3d激光雷达开发(生成RangeImage)
- IE8 新增的Javascript,css功能
- 基础总结篇之三:Activity的task相关
- php无法写入json,php json解析不出来怎么办
- 编译telepresence:没有规则可制作目标“tinywrap/ActionConfig.cxx”,由“telepresence-ActionConfig.o” 需求。
- win10相机打不开,显示错误代码0xA00F4246(0x800706D9)
- 数据库中的数据模型 概念数据模型、逻辑数据模型、物理数据模型
- 社区电商平台有哪些运营模式
- kubectl命令补全
- Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference
- 你应该了解的工厂方法模式:优雅的代码永不过时
- 【详细教程】App inventor连接阿里云平台(APP显示STM32发来的温湿度数据等)
热门文章
- 对HTTPCONNECTION的理解
- php 实现数组转json数据结构,php怎么实现数组转json
- python 内存溢出能捕获吗_Python内存泄漏和内存溢出的解决方案
- MySQL可以用localhost 连接,但不能用IP连接的问题
- 转载(面向对象设计的原则)
- 关于input输入框内设置小图标的问题
- poj 3252 Round Numbers(数学)
- JAVA GUI THREAD---***
- bzoj3594 [Scoi2014]方伯伯的玉米田
- jquery.eq()