亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C/C++中抽象類詳解及其作用介紹

 更新時間:2021年09月02日 15:39:38   作者:我是小白呀  
這篇文章主要介紹了C/C++中抽象類詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

概述

抽象類 (abstract class), 是一些不用來定義對象, 而只作為基類被繼承的類. 由于抽象類常用作基類, 所以通常稱為抽象基類 (abstract base class).

在這里插入圖片描述

定義抽象類的唯一目的, 就是去建立派生類. 我們在抽象類基礎上要定義出功能各異的派生類, 再用這些派生類去建立對象.

抽象類 vs 具體類

凡是包含純虛函數的類都是抽象類. 純虛函數不用實現, 故不能被調用, 抽象類無法建立對象. 抽象類的作用是作為一個類簇的共同基類, 即為一個類簇提供一個公共接口.

在這里插入圖片描述

許多好的面向對象的系統(tǒng), 其層次結構的頂部是一個抽象類, 甚至頂部有好幾層都是抽象類. 如果在抽象類所派生出的新類中對基類的所有純虛數進行了定義. 那么這些函數就被賦予了具體的功能, 可以被調用. 這個派生類就不是抽象類, 而是可以用來定義對象的具體類 (concrete class).

如果在派生類中每有對所有純函數進行定義, 則此派生類仍然是抽象類, 不能用來定義對象.

案例

創(chuàng)建基類 Shape (形狀), 作為抽象類. Point (點), Circle (園) 是 Shape 類的直接派生類和間接派生類, Cylinder (圓柱體) 是 Shape 的間接派生類.

Shape 類:

#ifndef PROJECT6_SHAPE_H
#define PROJECT6_SHAPE_H

class Shape {
public:
    virtual double area() const {return 0.0;}
    virtual double volume() const {return 0.0;}
    virtual void shapeName() const = 0;
};

#endif //PROJECT6_SHAPE_H

Point:

#ifndef PROJECT6_POINT_H
#define PROJECT6_POINT_H

#include <iostream>
#include "Shape.h"
using namespace std;

class Point : public Shape{
private:
    double a, b;
public:
    Point(double p1, double p2) : a(p1), b(p2) {};
    virtual void shapeName() const {  // 對虛函數進行再定義
        cout << "This is point with a = "<< a <<" b = " << b << endl;
    }
};

#endif //PROJECT6_POINT_H

Circle:

#ifndef PROJECT6_CIRCLE_H
#define PROJECT6_CIRCLE_H

#include <iostream>
#include "Shape.h"
using namespace std;

class Circle : public Shape{
protected:
    double r;
public:
    Circle(double radius) : r(radius) {};
    virtual void shapeName() const {  // 對虛函數進行再定義
        cout << "This is circle with r = "<< r << endl;
    }
};

#endif //PROJECT6_CIRCLE_H

Cylinder 類:

#ifndef PROJECT6_CYLINDER_H
#define PROJECT6_CYLINDER_H

#include <iostream>
#include "Circle.h"
using namespace std;

class Cylinder : public Circle{
private:
    double h;
public:
    Cylinder(double r, double height) : Circle(r), h(height) {};
    virtual void shapeName() const {  // 對虛函數進行再定義
        cout << "This is circle with r = "<< r << " h = " << h << endl << endl;
    }
};

#endif //PROJECT6_CYLINDER_H

main:

#include <iostream>
#include "Shape.h"
#include "Point.h"
#include "Circle.h"
#include "Cylinder.h"
using namespace std;

int main() {
    // 創(chuàng)建對象
    Point point1(1.2, 2.3);  // 點對象
    Circle circle1(2.5);  // 圓對象
    Cylinder cylinder1(3.5, 7);

    point1.shapeName();
    circle1.shapeName();
    cylinder1.shapeName();

    Shape *pt;  // 指向基類的指針
    pt = &point1;
    pt->shapeName();
    pt = &circle1;
    pt->shapeName();
    pt = &cylinder1;
    pt->shapeName();

    return 0;
}

輸出結果:

This is point with a = 1.2 b = 2.3
This is circle with r = 2.5
This is circle with r = 3.5 h = 7

This is point with a = 1.2 b = 2.3
This is circle with r = 2.5
This is circle with r = 3.5 h = 7

抽象類的作用

雖然說抽象類不能定義對象, 但是可以定義指向抽象類數據的指針變量. 當派生類稱為具體類之后, 就可以用這種指針指向派生類對象. 然后通過該指針調用虛函數, 實現多態(tài)性的操作.

抽象類接口是面向對象程序設計中的核心概念, 是各種設計模式中必需的機制.

總結

  • 一個基類如果包含一個或一個以上純虛函數, 就是抽象基類
  • 抽象類不能也不必要定義對象
  • 抽象基類與普通基類不同, 它不是現實存在的對象的抽象
  • 在類的層次結構中, 頂層或最上面的幾層可以是抽象基類. 抽象基類體現了類族各類的共性, 把各類中共有的成員函數集中在抽象基類中聲明
  • 抽象類是類族的公共接口
  • 利用虛函數和多態(tài)性, 我們可以讓執(zhí)行環(huán)境處理特殊性, 減少工作量和工作難度

到此這篇關于C/C++中抽象類詳解及其作用介紹的文章就介紹到這了,更多相關C++抽象類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • C語言?智能指針?shared_ptr?和?weak_ptr

    C語言?智能指針?shared_ptr?和?weak_ptr

    這篇文章主要介紹了C語言?智能指針?shared_ptr?和?weak_ptr,weak_ptr引入可以解決shared_ptr交叉引用時無法釋放資源的問題,下面來學習具體相關內容吧,需要的朋友可以參考一下
    2022-04-04
  • Qt實現繪制一個簡單多邊形的示例代碼

    Qt實現繪制一個簡單多邊形的示例代碼

    QT提供了圖形繪制接口QPainter,通過該接口可以繪制多種圖形,包括多邊形。本文就來利用它實現繪制一個簡單的多邊形,感興趣的可以嘗試一下
    2022-11-11
  • C語言中查詢進程信號是否被遮罩或擱置的簡單方法

    C語言中查詢進程信號是否被遮罩或擱置的簡單方法

    這篇文章主要介紹了C語言中查詢進程信號是否被遮罩或擱置的簡單方法,包括sigprocmask函數和sigpending函數的簡介,需要的朋友可以參考下
    2015-09-09
  • C語言初識變量常量字符串轉義符及注釋方式簡介

    C語言初識變量常量字符串轉義符及注釋方式簡介

    最強的C語言筆記,此處對于C語言的基礎部分做一個簡要的介紹,作者實屬初學,寫博客也是作者學習的一個過程,若文中內容有理解不到位或者有不當之處,還請朋友們不吝指正
    2021-11-11
  • 利用C++實現一個線程安全的map

    利用C++實現一個線程安全的map

    這篇文章主要為大家詳細介紹了如何利用C++實現一個線程安全的map(使用ChatCPT生成),代碼是通過兩輪對話完善的,感興趣的小伙伴可以了解一下
    2023-05-05
  • C#將Unicode編碼轉換為漢字字符串的簡單方法

    C#將Unicode編碼轉換為漢字字符串的簡單方法

    下面小編就為大家?guī)硪黄狢#將Unicode編碼轉換為漢字字符串的簡單方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++中的map使用方法詳解

    C++中的map使用方法詳解

    C++中的map是一種關聯容器,用于存儲鍵值對。它提供了一種非常高效的方法來快速查找特定的值,并且允許我們根據鍵來排序和遍歷數據。在本文中,我們將深入了解C++中的map以及如何使用它來提高程序的效率,感興趣的朋友可以參考下
    2023-05-05
  • typedef_struct與struct之間的區(qū)別

    typedef_struct與struct之間的區(qū)別

    本篇文章主要是對typedef struct與struct之間的區(qū)別進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • C++隨機生成迷宮算法

    C++隨機生成迷宮算法

    這篇文章主要為大家詳細介紹了C++隨機生成迷宮算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 基于matlab實現DCT數字水印嵌入與提取

    基于matlab實現DCT數字水印嵌入與提取

    數字水印技術是將一些標識信息直接嵌入數字載體當中,?或間接表示在信號載體中,?且不影響原載體的使用價值。本文主要為大家介紹了基于matlab如何實現數字水印的嵌入與提取,感興趣的可以學習一下
    2022-01-01

最新評論