- 时间进度
- C++是什么?
- 多态
- 什么是多态?
- 生活中的多态
- C++中的多态
- 赋值兼容
- 赋值兼容规则
- 实现
- 安全转换
时间进度
Day101 ok
Day804 ok
Day805 ok
C++是什么?
C++大部分包含C语言。
C++完全兼容C语言。
C++在C语言的基础上添加:封装、继承、多态、模板(STL)。
C语言在大规模程序和需要高度抽象和建模时,不能满足。
面向过程:写函数。
面向对象:写类。
C语言也可以面向过程,C++也可以面向过程,面向对象和面向过程是思想。
各语言排行榜
应用领域:高效,同时需要好的抽象机制和建模能力的领域。
高效 + 面向对象:系统开发。
桌面系统,服务器开发,电信,金融,电商,通信,媒体,路由器,游戏、分布式、云计算等。
举例:QQ、WPS、英雄联盟、Nginx、Qt、MySQL、谷歌浏览器、PS、UE、JVM、FFMPEG(音视频行业的瑞士军刀)、360、VMWare、魔兽世界、MFC、ACE、Boost、Cocos(基于循环)、CrossApp(基于事件)、Unreal、GMQ(分布式)、JsonCpp(前后台数据传输)、libevent(网络框架)、TinyHTTPd(HTTP实现源码)、Nginx(HTTP服务、负载均衡、反向代理、邮件服务)、RTMPDump(拉流)、SDL(做界面)、XML(前后台数据传输)。
多态
什么是多态?
生活中的多态
几个相似而不完全相同的对象,发出同一消息,做出不同反应,执行不同的操作。
C++中的多态
由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。
多态能增加程序的灵活性,可以减轻系统升级,维护,调试的工作量和复杂度。
设计模式就是将多态的性能发挥到极致。
赋值兼容
赋值兼容是多态的前提条件。
赋值兼容规则
在需要基类对象的任何地方,都可以使用公有派生类对象来替代。
只有在公有派生类中才有赋值兼容,赋值兼容是一种默认行为,不需要任何显示的转化步骤。
赋值兼容细化:
- 派生类的对象可以赋值给基类对象。
- 派生类的对象可以初始化基类的引用。
- 派生类对象的地址可以赋给指向基类的指针。
实现
代码演示:
#include <iostream>
using namespace std;
class Shape
{
public:
Shape(int x, int y): _x(x), _y(y) {}
void draw()
{
cout << "draw Shap ";
cout << "start (" << _x << "," << _y << ") " << endl;
}
protected:
int _x;
int _y;
};
class Circle : public Shape
{
public:
Circle(int x, int y, int r)
:Shape(x, y), _r(r) {}
void draw()
{
cout << "draw Circle ";
cout << "start (" << _x << "," << _y << ") ";
cout << "raduis r = " << _r << endl;
}
private:
int _r;
};
int main()
{
Shape s(3, 5);
s.draw();
Circle c(1, 2, 4);
c.draw();
//子类对象赋给父类对象
s = c;
s.draw();
//子类对象赋给父类引用
Shape& rs = c;
rs.draw();
//子类对象地址赋给父类指针。避免赋值,父类和子类地址相同,类型不同,可访问范围不同。
Shape* ps = &c;
ps->draw();
return 0;
}
运行结果:
安全转换
子类是父类的超集,所以赋值兼容是安全的。
子类对象初始化的时候,调用父类的构造器,也是发生了赋值兼容的问题。除此之外,其它任何父类成员调用,均是如此。
大范围的指针向小范围的指针转化是安全的。反之,不亦然。