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语言的基础上,增加 ...
随机推荐
- RichTextBoxEx
using System; using System.Collections.Specialized; using System.Drawing; using System.Drawing.Imagi ...
- jquery-easyui-tree异步树
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- bootstrap学习笔记系列4------bootstrap按钮
按钮标签 在<a>,<button>或input元素上使用按钮class.但是为了避免跨浏览器的不一致性,建议使用<button>标签. <!DOCTYPE ...
- Java总结篇系列:Java 反射
Java反射: package com.corn; import java.lang.reflect.Constructor; import java.lang.reflect.Field; impo ...
- Redis使用总结
1.Redis安装 redis的安装非常的简单,而且Redis并不依赖其他环境和标准库,很容易上手,这可能也是它流行的一个原因.这里为了测试方便,用的都是windows 环境下测试.下载Windows ...
- cros解决跨域
- 鼠标滑动加载div
- 【Java每日一题】20161028
package Oct2016; public class Ques1028 { public static void main(String[] args){ new B().out(); // 输 ...
- Delphi Berlin 10.1 for 小米平板2 (Win 10) 电子罗盘测试
Windows 10 下没有 Sensor.HeadingXSensor.HeadingYSensor.HeadingZ 需改用 Sensor.CompMagHeading
- eclipse新建maven项目(2)
本篇博文是继续之前的博文eclipse新建maven项目(1),那篇博文不在随笔在文章中.首先按照之前那篇博文进行创建maven项目操作,一系列操作下来之后发现刷新项目后会报错: 别急哈,可以解决. ...