Android C++系列:C++最佳实践2抽象类

简介: OP面向对象程序设计的核心是数据抽象,继承和动态绑定。前面的文章我们介绍了使用virtual的虚类实现动态绑定的多态,有时候我们在做抽象时,对于抽象的实体不想让被人实例化,虚类没有这个功能,我们Java里面我们有抽象类,有接口来抽象一个实体的行为,而不允许被实例化,C++有没有这样的功能呢?C++怎么实现抽象类呢?

image.png


1. 背景


OOP面向对象程序设计的核心是数据抽象,继承和动态绑定。前面的文章我们介绍了使用virtual的虚类实现动态绑定的多态,有时候我们在做抽象时,对于抽象的实体不想让被人实例化,虚类没有这个功能,我们Java里面我们有抽象类,有接口来抽象一个实体的行为,而不允许被实例化,C++有没有这样的功能呢?C++怎么实现抽象类呢?


2. 纯虚函数


介绍抽象类之前我们先了解下纯虚函数:我们通过在函数体的位置,即在声明语句的分号之前,书写 = 0 就可以将一个虚函数说明为纯虚函数。和普通的虚函数不一样,一个纯虚函数无需定义。而且 = 0 只能出现在虚函数声明语句处:


class IBird {
public:
  void fly() = 0;
}


我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部,不能在类的内部为一个=0的函数提供函数体。


派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,这是合法的,但是很可能不符合我们的预期。特别是在继承纯虚函数时,可能因为形参列表不匹配导致声明了新的函数,而纯虚函数没有被真正实现,怎么让编译器帮助我么实现这一点呢?


在C++11新标准中,我们可以使用override关键字来说明子类中的虚函数。如果使用override标记了某个函数,但是这个函数又没有覆盖已存在的虚函数,编译器就直接报错了。


3. 抽象基类


了解了纯虚函数后我们就可以定义抽象类了:含有纯虚函数的类是抽象基类。抽象基类负责定义接口,而后续的其他类可以覆盖这个接口。


我们不能直接创建一个抽象基类的对象,子类构造函数只初始化它的直接基类,这个和Java类似,只在子类的构造中调用super初始化直接子类。


抽象基类的设计可以替代我们Java中的接口和抽象类,如果只定义行为,就类似于Java中的接口,如果包含了数据则可以类比成Java中的抽象类。


4. 总结


通过使用数抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相识关系建模;使用动态绑定,可以在一定程度上忽略相识类型的区别,以统一的方式使用对象。纯虚函数是实现抽象基类的基础。本文我们介绍了纯虚函数和抽象基类,这块语法上本身比较简单,下一篇我们介绍继承时的访问控制。

目录
相关文章
|
17天前
|
存储 移动开发 数据库
构建高效Android应用:探究LiveData和ViewModel的最佳实践
【4月更文挑战第20天】 在动态演化的移动开发领域,构建一个既响应迅速又能够在用户界面保持稳定的Android应用是至关重要的。近年来,随着Android架构组件的推出,特别是LiveData和ViewModel的引入,开发者得以更有效地管理应用状态并优化用户界面的响应性。本文将深入探讨LiveData和ViewModel的实现机制,并通过案例分析展示如何结合它们来构建一个高效且健壮的Android应用架构。我们将重点讨论如何通过这些组件简化数据绑定过程、提高代码的可维护性和测试性,同时确保用户界面的流畅性。
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
73 5
|
2月前
|
消息中间件 负载均衡 监控
【ZMQ PUB模式指南】深入探究ZeroMQ的PUB-SUB模式:C++编程实践、底层原理与最佳实践
【ZMQ PUB模式指南】深入探究ZeroMQ的PUB-SUB模式:C++编程实践、底层原理与最佳实践
221 1
|
9天前
|
NoSQL API Redis
最佳实践|如何使用c++开发redis module
本文将试着总结Tair用c++开发redis module中遇到的一些问题并沉淀为最佳实践,希望对redis module的使用者和开发者带来一些帮助(部分最佳实践也适用于c和其他语言)。
|
12天前
|
安全 vr&ar C++
C++:编程语言的演变、应用与最佳实践
C++:编程语言的演变、应用与最佳实践
|
18天前
|
数据库 Android开发 开发者
实现高效安卓应用:探究LiveData和ViewModel的最佳实践
【4月更文挑战第19天】 在构建响应式的Android应用程序时,LiveData和ViewModel是两个核心组件。它们不仅提供了数据持有和界面更新的机制,还促进了组件间的解耦。本文将深入探讨如何通过结合LiveData和ViewModel来优化应用架构,提升用户体验,并确保数据的一致性和生存期管理。我们将透过实际案例分析,揭示这些技术如何协同工作以应对复杂的UI场景,并展示如何在实际项目中实施这些最佳实践。
|
23天前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
27 5
|
27天前
|
C++
C++面向对象编程中的 纯虚函数 与 抽象类
C++面向对象编程中的 纯虚函数 与 抽象类
|
1月前
|
C++
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
|
2月前
|
移动开发 调度 Android开发
构建高效Android应用:探究Kotlin协程的最佳实践
在移动开发领域,性能优化和资源管理是至关重要的。特别是对于Android开发者来说,合理利用Kotlin协程可以大幅提升应用的响应性和用户体验。本文将深入探讨Kotlin协程的核心概念、优势以及它们在Android项目中的实际应用。我们还将通过代码示例来揭示如何有效地使用协程进行后台任务处理,避免阻塞UI线程,并确保内存的有效管理。文章的目标是为读者提供一套实用的指南,帮助他们在Android开发中充分利用Kotlin协程的强大功能。
15 1