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语言的基础上,增加 ...
随机推荐
- 【原创】kafka controller源代码分析(一)
Kafka集群中的一个broker会被作为controller负责管理分区和副本的状态以及执行类似于重分配分区之类的管理任务.如果当前的controller失败了,会从剩下的broker中选出新的co ...
- Bootstrap学习笔记系列6-----Bootstrap文本显示
通过对文本或者链接添加下面的类,会使其展示不同的颜色,如果文本是个链接,鼠标移动到文本上,颜色会变暗. text-muted柔和的文本(深色) text-primary 表示基础的文本(蓝色) tex ...
- 【C#】VS2015开发环境的安装和配置(一)2016-08-03更新
分类:C#.VS2015.WPF.ASP.NET MVC.Android.iOS.Unity3D: 更新日期:2016-08-03 一.简介 为了避免网上乱七八糟的过时介绍,避免误导初学者,这次把至2 ...
- IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误
IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ...
- request的各种方法大全
request.setAttribute("result", district);//放进作用域,可以用el表达式在页面展示.(名字,调用方法的结果) pageContext.re ...
- 第 27 章 CSS 传统布局[上]
学习要点: 1.布局模型 2.表格布局 3.浮动布局 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 早期所使用的传统布局,很多情况下,这些布局方式还是非常有用的. 一.布局模型 在早期没有平 ...
- poj-1703-Find them, Catch them
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 41928 Accepted: ...
- Spring mvc web.xml中 urlpatten的配置问题
在使用spring mvc 是我们会配置spring 的DispatcherServlet作为请求的转发器. <servlet> <servlet-name>spring< ...
- java 基础加强--书籍+题目+上机测试
scjp test( 在线测试网站):http://scjptest.com/mock-test.xhtml <SCJP Sun® Certified Programmer for Java™ ...
- java集合-HashTable
概述 和 HashMap 一样,Hashtable 也是一个散列表,它存储的内容是键值对. Hashtable 在 Java 中的定义为: public class Hashtable<K,V& ...