C++面试基础系列-abstract

2024-08-22 09:36

本文主要是介绍C++面试基础系列-abstract,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录


文章目录

  • 系列文章目录
  • C++面试基础系列-abstract
    • Overview
    • 1.abstract关键点
    • 2.C++ 抽象类和纯虚函数的例子
    • 3.abstract重点
    • 关于作者


C++面试基础系列-abstract

Overview

在C++中,abstract这个概念主要与抽象类(Abstract Class)相关。抽象类是一种不能被实例化的类,它通常包含至少一个纯虚函数(Pure Virtual Function)。抽象类用于定义接口或行为规范,可以被其他类继承并实现具体的功能。

1.abstract关键点

以下是一些关于C++中抽象类的关键点:

  • 纯虚函数:
    • 纯虚函数是在基类中声明但没有实现的虚函数,其声明方式是在函数声明的末尾加上= 0。
    • 例如:virtual void doSomething() = 0;
  • 抽象类的定义:
    • 包含至少一个纯虚函数的类就是抽象类。
    • 抽象类不能被直接实例化,但可以被用作其他类的基类。
  • 继承抽象类:
    • 派生类必须实现基类中的所有纯虚函数,否则派生类也会是抽象类。
  • 接口定义:
    • 抽象类通常用于定义接口,让不同的派生类实现相同的接口。
  • 多态性:
    • 抽象类支持多态性,可以通过基类指针或引用调用派生类重写的虚函数。
      示例:
// 抽象类声明
class Shape {
public:virtual void draw() const = 0;  // 纯虚函数virtual ~Shape() {}  // 虚析构函数,确保派生类析构正确性
};// 派生类实现抽象类
class Circle : public Shape {
public:void draw() const override {// 绘制圆形的代码}
};// 使用抽象类
Shape* shape = new Circle();
shape->draw();
delete shape;
  • 抽象类的作用:
    • 强制实现接口:确保所有派生类都实现了抽象类中定义的纯虚函数。
    • 代码复用:基类可以提供一些通用的实现,派生类可以重写或继承这些实现。
  • 设计原则:
    • 遵循里氏替换原则(Liskov Substitution Principle),确保派生类可以替换其基类。
  • 注意事项:
    • 抽象类通常包含虚析构函数,以确保派生类的析构函数被正确调用。
  • C++11及以后版本:
    • C++11引入了final关键字,可以修饰类或成员函数,表示它们不能被进一步继承或重写。

抽象类是C++面向对象编程中的一个重要概念,它有助于实现代码的模块化和可扩展性。通过使用抽象类,开发者可以定义清晰的接口,并在不同的派生类中实现这些接口的具体行为。

2.C++ 抽象类和纯虚函数的例子

  • 在这个例子中,Shape 是一个抽象类,它定义了一个纯虚函数 getArea。
    • Circle 和 Rectangle 是 Shape 的派生类,它们分别实现了 getArea 函数。
    • 由于 Shape 是抽象类,我们不能直接创建它的实例,但可以创建 Circle 和 Rectangle 的实例。
#include <iostream>// 抽象基类
class Shape {
public:// 纯虚函数,用于计算面积virtual double getArea() const = 0;// 虚析构函数virtual ~Shape() {}
};// 派生类 Circle
class Circle : public Shape {
public:// 构造函数Circle(double radius) : radius(radius) {}// 实现基类的纯虚函数double getArea() const override {return 3.14159 * radius * radius;}private:double radius;
};// 派生类 Rectangle
class Rectangle : public Shape {
public:// 构造函数Rectangle(double width, double height) : width(width), height(height) {}// 实现基类的纯虚函数double getArea() const override {return width * height;}private:double width, height;
};int main() {// 由于 Shape 是抽象类,不能直接实例化// Shape shape; // 错误Circle circle(5.0);Rectangle rectangle(4.0, 6.0);std::cout << "Circle area: " << circle.getArea() << std::endl;std::cout << "Rectangle area: " << rectangle.getArea() << std::endl;return 0;
}

3.abstract重点

  • 纯虚函数使一个类变成抽象类
  • 抽象类类型的指针和引用
  • 如果我们不在派生类中覆盖纯虚函数,那么派生类也会变成抽象类
  • 抽象类可以有构造函数
  • 构造函数不能是虚函数,而析构函数可以是虚析构函数
// 抽象类
class Base  {
public:Base(){ cout << "Constructor: Base" << endl; }virtual ~Base(){ cout << "Destructor : Base" << endl; }virtual void func() = 0;
};class Derived: public Base {
public:Derived(){ cout << "Constructor: Derived" << endl; }~Derived(){ cout << "Destructor : Derived" << endl;}void func(){cout << "In Derived.func()." << endl;}
};

当基类指针指向派生类对象并删除对象时,我们可能希望调用适当的析构函数。
如果析构函数不是虚拟的,则只能调用基类析构函数。


关于作者

  • 本文作者:WeSiGJ
  • 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
  • GitHub:https://github.com/wesigj/CPLUSCPLUSBOYS
  • CSDN:https://blog.csdn.net/wesigj
  • 微博:
  • 微信公众号:WeSiGJ——喜欢就关注一下吧

请添加图片描述

这篇关于C++面试基础系列-abstract的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095901

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i