C++语言-05-三大特性
概述
C++ 是面向对象的语言,具备 OOP 的基本特性。
封装
- 概念
- 将数据和操作数据的函数绑定在一起
- 作用
- 避免受到外界的干扰和误用,确保了安全
- 与封装相关的概念
- 数据抽象
- 仅向用户暴露接口而把具体的实现细节隐藏起来的一种机制,是一种依赖于接口和实现相分离的编程技术
- 好处
- 类的内部收到保护,不会因无意的用户级错误导致对象状态受损
- 可以在只改变类的实现细节,而不改变用户级代码的情况下,应对变化的需求
- 注意
- 要尽量地对外隐藏每个类的实现细节
- 友元类回暴露类的实现细节,降低封装性
- 策略
- 抽象将代码分离为接口和实现,在设计组件时,必须保持接口独立于实现。保证底层实现改变时,接口保持不变
- 接口
- 基于抽象类实现。描述类的行为和功能,不关注类的特定实现
- 抽象类
- 类中至少有一个函数被定义为纯虚函数
- 作用
- 为其他类提供一个可以继承的适当的基类
- 作为作为接口
- 注意
- 抽象类不能被实例化,
- 具体类(与抽象类相对应)可以被实例化
- 策略
- 面向对象的系统通常使用一个抽象类为外部应用程序提供一个适当的、通用的、标准化的接口。派生类通过集成抽象基类,来集成类似的操作
- 外部应用程序通过实现抽象基类中的纯虚函数,来提供功能
- 数据抽象
继承
概念
- 继承是 OOP 中一个重要的概念,代表了一种 is a 的关系
作用
- 提高了代码重用率和执行效率
单继承与多继承
单继承
class derived-class: access-specifier base-class
/**
base-class 为基类
derived-class 为派生类
access-specifier 访问控制符,
*/
多继承
class derived-class: access-specifier baseA, access-specifier baseB....
继承中的访问控制
访问修饰符 public protected private 同一个类 yes yes yes 派生类 yes yes no 外部类 yes no no 继承的类型(通过access-specifier指定)
- 公有继承
- 基类中的公有成员和保护成员分别成为派生类中对应的公有成员和保护成员;基类中私有成员不能被派生类直接访问,可以通过调用基类的公有成员和保护成员来间接访问
- 保护继承
- 基类中的公有成员和保护成员成为派生类中的保护成员
- 私有继承
- 基类中的公有成员和保护成员成为派生类中的私有成员
- 公有继承
注意
- 派生类继承了绝大部分的基类方法,下列方法除外
- 构造函数、拷贝构造函数和析构函数
- 重载运算符
- 友元函数
- 派生类继承了绝大部分的基类方法,下列方法除外
多态
- 概念
- 调用成员函数期间,根据调用函数的对象的类型动态的决定最终调用的函数(虚函数)实现
- 基于继承和虚函数实现,是一种动态绑定技术
- 使用场景
- 成员函数调用时,子类对象调用相应的子类成员函数
- 向成员函数传递参数时,父类类型的参数可以传递子类对象
- 与多态相关的概念
- 静态连接(早绑定)
- 在程序执行之前,编译器设置对象内容决定调用响应的函数
- 动态连接(后期绑定)
- 在程序执行期间,根据所调用的对象类型来选择调用的函数
- 虚函数会告诉编译器不要在程序执行之前根据对象内容决定决定最终调用的函数(静态连接),等到程序执行时根据所调用的对象类型来选择调用的函数(动态连接)
- 静态连接(早绑定)
示例
辅助的枚举类型
// 脊椎动物动物的分类
enum AnimalType {
AnimalTypeMammalia, // 哺乳类
AnimalTypeAves,
AnimalTypePisces,
AnimalTypeAmphibia,
AnimalTypeReptilia,
AnimalTypeCyclostomata
};
基类
// 基类
/** Animal */
class Animal {
// 属性
public:
string name; // 姓名,每个动物都具有名字
protected:
enum AnimalType type; // 动物类别,只有确定的动物才有类别
private:
double lifeTime; // 寿命,不允许随便设置
// 方法
public:
void setName(char n[]) {
name = n;
}
string getName() {
return name;
}
// 声明函数,在派生类中实现,多态的一种形式
void setType();
};
接口
// 接口
/** AnimalActivity是一个抽象类,作为一个接口,描述了Animal相关的行为 */
class AnimalActivity {
public:
// 纯虚函数,描述Animal的行为
virtual void run() = 0;
};
派生类
// 派生类
/** Dog类 */
class Dog : public Animal, public AnimalActivity {
// 方法
public:
// 实现基类Animal中的函数
void setType() {
cout << "设置了Dog的类别" << endl;
type = AnimalTypeMammalia;
}
// 实现接口AnimalActivity中的纯虚函数
void run() {
cout << "Dog: " << name;
cout << " 在奔跑着追老鼠" << endl;
}
};
/** Cat类 */
class Cat : public Animal, public AnimalActivity {
// 方法
public:
// 实现基类Animal中的函数
void setType() {
cout << "设置了Cat的类别" << endl;
type = AnimalTypeMammalia;
}
// 实现接口AnimalActivity中的纯虚函数
void run() {
cout << "Cat: " << name;
cout << " 在奔跑着追小偷" << endl;
}
};
使用方法
int main(int argc, const char * argv[]) {
// 创建对象
Animal animal;
Dog MAX;
Cat TOM;
// Dog的相应操作
MAX.name = "MAX";
MAX.setType();
MAX.run();
cout << endl;
// Cat的相应操作
TOM.name = "Tom";
TOM.setType();
TOM.run();
return 0;
}
C++语言-05-三大特性的更多相关文章
- Java语言的三大特性
Java语言的三大特性 1.封装 1.1 概念: 封装也成为信息异常,隐藏对象的属性和实现细节,仅对外公开接口(外部不可以直接看到对象的属性细节并且不能直接更改属性的值,只能通过方法来读取或更改属性 ...
- Java学习的随笔(2)Java语言的三大特性
1.面向对象的三大特性 面向对象的三大特性主要包括:继承.封装.多态 (1)继承:就是指子类(导出类)获得了基类的全部功能(所有的域和方法). 注:在子类中,想要调用基类的方法可以使用“super. ...
- Java面试题,Java三大特性之一——多态的理解
首先我们知道Java是一门面向对象的语言 面向对象三大特性,封装.继承.多态. 封装.继承.多态 ↓ 无论是学习路线,还是众人的口语习惯,都是按照这个这样进行排序,这是有原因的.因为封装好了才能继承, ...
- oc语言--面向对象的三大特性
一.封装 1.什么是封装 在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将对象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的 ...
- 黑马程序员——OC语言 三大特性之多态
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之一的多态 (一)多态的基本概念 OC对象具有多态性体现在 Per ...
- 黑马程序员——OC语言 三大特性之继承
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之继承 (一)继承的基本用法 先建立个Animal再用Dog继承前 ...
- 面试问题之C++语言:面向对象的三大特性
转载于:https://www.cnblogs.com/BEN-LK/p/10720249.html 面向对象的三大特性:封装.继承.多态 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和 ...
- JS三大特性
抽象 在分析三大特性之前我们要先了解什么叫抽象. 定义: 在定义一个类的时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板),这种研究问题的方法就称为抽象 一.封装 定义: ...
- Java 浅析三大特性之一继承
上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
- 黑马程序员_ Objective-c 概述及面向对象与三大特性
-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...
随机推荐
- C# 视频流操作
发送视频流 void SendVideoBuffer(object bufferIn) { try { TcpClient tcp = ); NetworkStream ns = tcp.GetStr ...
- nodejs中exports与module.exports的实践
只要是在nodejs中写自己的文件模块就少不了会遇到module.exports和exports的使用,看别人的代码大多都会使用“module.exports=exports=<对象/函数等&g ...
- 360手机卫士会影响Widget的运行
最近开发了一个Widget,老是运行时间长了就会出现NullPointerException错误,一直不知道是什么原因造成的,后来把Widget加入360一键清理的保护名单,错误就少很多,但是仍然有错 ...
- 【Java每日一题】20161125
package Nov2016; import java.util.LinkedList; import java.util.List; public class Ques1125 { public ...
- pymssql examples
http://pymssql.org/en/latest/pymssql_examples.html Example scripts using pymssql module. Basic featu ...
- nginx平台初探(100%)
http://tengine.taobao.org/book/chapter_02.html 初探nginx架构(100%)¶ 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么 ...
- 修复 XE8 FMX Windows 列印旋转文字问题
问题:XE8 Firemonkey Windows 无法列印旋转文字(与显示在视窗里的代码相同时) 适用:XE8 Windows 平台(其它平台测试没问题) 修复前效果: 修复后效果: 修复方法: 请 ...
- Fiddler (五) Mac下使用Fiddler
Fiddler是用C#开发的. 所以Fiddler不能在Mac系统中运行. 没办法直接用Fiddler来截获MAC系统中的HTTP/HTTPS, Mac 用户怎么办呢? Fiddler可 ...
- GJM : 基于Actor模式的c#网络游戏服务器的实现和Unity游戏客户端的连接 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- C# 7个读写Excel文件的类库
转载自:http://www.cnblogs.com/wintersun/archive/2013/02/26/2933294.html 有时我们在项目需要操作Excel文件,读或写,导出数据等. ...