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语言的基础上,增加 ...
随机推荐
- 初探Spring - IOC原理
一.IOC是什么 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来降低代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...
- NET RichTextBox控件如何可以插入图像
本文介绍.NET RichTextBox控件如何可以插入图像,控制和ActiveX对象通过使用OLE方式,如在解释,.不幸的是,它涵盖了只用一个C源代码样本,所以我需要在托管代码(C#)实施类似的解决 ...
- C语言学习020:可变参数函数
顾名思义,可变参数函数就是参数数量可变的函数,即函数的参数数量是不确定的,比如方法getnumbertotal()我们即可以传递一个参数,也可以传递5个.6个参数 #include <stdio ...
- 如何将CKeditor编辑器的上传和thinkphp结合
转载:THINKPHP代码中 lxepoo的文章 有时候我们会发现,我们需要对上传文件进行日志记录,这样的记录通常写在LOG文件或数据库中,那么,通过TP本身的上传类,可以实现的,但是只能做到编辑器外 ...
- 【C#】使用IExtenderProvider为控件添加扩展属性,像ToolTip那样
申明: - 本文适用于WinForm开发 - 文中的“控件”一词是广义上的说法,泛指包括ToolStripItem.MenuItem在内单个界面元素,并不特指继承自Control类的狭义控件 用过To ...
- QTableWidget控件总结
[1]QTableWidget简介 QTableWidget是QT对话框设计中常用的显示数据表格的控件. 学习QTableWidget就要首先看看QTableView控件(控件也是有”家世“的!就像研 ...
- java的各种类型转换汇总
java类型转换 Integer String Long Float Double Date 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Intege ...
- MySQL Workbench 修改快捷键
在安装根目录查到\data\main_menu.xml这个文件 例如,修改执行sql语句的快捷键为F5 <value type="object" struct-name=&q ...
- CodeBlock
CodeBlock官网是: http://www.codeblocks.org/ 选择Download the binary release: 根据自己电脑的情况选择想要的版本:(以博主电脑为例,wi ...
- Mac OS Git 安装
一.Git是一个分布式的代码版本管理工具.类似的常用工具还有SVN,CVS.最大的特点也是优点在于提供分布式的代码管理 1.分支代码只有一份! 使用过svn的童鞋想必都知道,当我们要开发一个新功能或者 ...