抽象基类(ABC)

本文介绍了抽象基类(ABC)的概念,强调了其作为基类不可实例化的特性。通过C++的例子展示了如何通过纯虚函数实现ABC,并探讨了为什么需要ABC,主要是为了解决代码复用和接口规范问题。使用抽象基类可以确保子类实现必要的方法,并简化代码管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽象基类(ABC)



前言

我对抽象基类(Abstract Base Class,ABC)的理解在两个点上。第一点是抽象,即高度抽象;第二点是基类,对抽象基类来说,它的存在只是为了作为基类(区别于具体类),不可以被实例化

高度抽象一词听起来本身就很“抽象”,不妨让我用“总结”这个词进行通俗解释。比方这里有两类人,一类只是聋人,另一类只是盲人。现在我们需要对这两类人抽象,也就是需要总结两类人的相同点+不同点,然后付诸于代码。为方便起见,这里就列举三个行为:散步为相同点,看得见与看不见为不同点,听得见与听不见为不同点——这样一个过程,就是在“抽象”。(好吧,这般解释可能还是抽象)

如何实现ABC

在C++中,virtual关键字使得函数有虚函数非虚函数之分,显然,virtual的存在让一个函数成为虚函数。而虚函数中,又分纯虚函数和非纯虚函数:

virtual void hear() = 0;  // 纯虚函数

virtual void walk();  // 非纯虚函数(常规虚函数)

在一个类中,如果至少有一个纯虚函数,那么认为这个类是抽象基类。

class DeafPerson {
   
   
public:
	// ...
	virtual void walk() = 0;
	// ...
};
// ...

如此一来,DeafPerson就是一个抽象基类了。

为什么需要ABC

我们都知道,无论盲人还是聋人,他们都是人,他们都可以散步,但是不一定有视觉或听觉的能力。我们当然可以做以下设计:

class DeafPerson {
   
   
public:
	string name;  // 名字
	void walk() {
   
    cout << "is able to walk" << endl; }
	void hear() {
   
    cout << "is not able to hear" << endl; }
	void see() {
   
    cout << "is able to see" << endl; }
};

class BlindPerson {
   
   
public:
	string name;
	void walk() {
   
    cout << "is able to walk" << endl; }
	void hear() {
   
    cout <<</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值