最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中實現(xiàn)接口繼承與實現(xiàn)繼承的方法及它們的區(qū)別

 更新時間:2024年12月17日 10:36:48   作者:夕泠愛吃糖  
在 C++ 中,接口繼承和實現(xiàn)繼承是兩種不同的繼承方式,它們在設計模式、代碼復用和多態(tài)性方面有著不同的應用,下面將分別解釋這兩者的概念、實現(xiàn)方式及其區(qū)別,感興趣的朋友一起看看吧

概念

在 C++ 中,接口繼承和實現(xiàn)繼承是兩種不同的繼承方式,它們在設計模式、代碼復用和多態(tài)性方面有著不同的應用。下面將分別解釋這兩者的概念、實現(xiàn)方式及其區(qū)別。

接口繼承

接口繼承指的是只繼承類的接口(即公共的成員函數(shù)聲明)而不實現(xiàn)這些函數(shù)。通常通過純虛函數(shù)來實現(xiàn)。這樣做的目的是約定一個行為規(guī)范,而具體的實現(xiàn)則留給派生類去完成。
示例:

#include <iostream>  
// 定義一個接口  
class Drawable {  
public:  
    virtual void draw() const = 0; // 純虛函數(shù)  
    virtual ~Drawable() {}          // 虛析構(gòu)函數(shù)以保證正確的析構(gòu)  
};  
class Circle : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a circle." << std::endl;  
    }  
};  
class Square : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a square." << std::endl;  
    }  
};  
void render(const Drawable& shape) {  
    shape.draw(); // 調(diào)用接口的實現(xiàn)  
}  
int main() {  
    Circle circle;  
    Square square;  
    render(circle); // 輸出: Drawing a circle.  
    render(square); // 輸出: Drawing a square.  
    return 0;  
}

輸出

Drawing a circle.  
Drawing a square.

代碼解析

接口定義

class Drawable {  
public:  
    virtual void draw() const = 0; // 純虛函數(shù)  
    virtual ~Drawable() {}          // 虛析構(gòu)函數(shù)以保證正確的析構(gòu)  
};
  • 類 Drawable 是一個接口類,使用大寫字母開頭的名稱有助于表明它是一個接口。
  • virtual void draw() const = 0; 聲明了一個純虛函數(shù) draw(),這意味著 Drawable 類沒有實現(xiàn)此函數(shù),任何派生類必須實現(xiàn)這個函數(shù)。這里的 = 0 表示這是一個純虛函數(shù),任何包含它的類都被視為抽象類,無法直接實例化。
  • virtual ~Drawable() {} 是一個虛析構(gòu)函數(shù),允許使用基類指針刪除派生類實例時確保資源正確釋放。這是接口設計的良好實踐。
  • 實現(xiàn)接口的派生類
class Circle : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a circle." << std::endl;  
    }  
};
  • class Circle : public Drawable 表示 Circle 類繼承自 Drawable 接口,派生類必須實現(xiàn)所有的純虛函數(shù)。
  • void draw() const override 這是對基類 Drawable 中 draw() 的實現(xiàn)。通過 override 關鍵字指示這是對基類虛函數(shù)的重寫。
  • 在 draw() 方法中,我們使用 std::cout 輸出 “Drawing a circle.”。
class Square : public Drawable {  
public:  
    void draw() const override {  
        std::cout << "Drawing a square." << std::endl;  
    }  
};
  • Square 類實現(xiàn)與 Circle 類類似,只是輸出的信息不同。它同樣繼承了 Drawable 接口并實現(xiàn) draw() 方法。
  • 渲染函數(shù)
void render(const Drawable& shape) {  
    shape.draw(); // 調(diào)用接口的實現(xiàn)  
}
  • render 函數(shù) 接受一個常量引用類型的 Drawable 對象,這允許傳入任何實現(xiàn)了 Drawable 接口的對象。
  • 在函數(shù)內(nèi)部調(diào)用 shape.draw(),通過多態(tài)的機制,這將調(diào)用傳入對象的具體 draw() 實現(xiàn),打印出形狀信息。
  • 主函數(shù)
int main() {  
    Circle circle;  
    Square square;  
    render(circle); // 輸出: Drawing a circle.  
    render(square); // 輸出: Drawing a square.  
    return 0;  
}
  • Circle circle; 和 Square square; 創(chuàng)建了 Circle 和 Square 對象。
  • render(circle); 和 render(square); 調(diào)用了 render 函數(shù),分別傳入 circle 和 square 對象。
  • 由于 render 函數(shù)使用了接口類型 Drawable 的引用,因此可以通過多態(tài)機制實現(xiàn)適當?shù)暮瘮?shù)調(diào)用。

關鍵點

  • Drawable 類是一個接口,它定義了一個純虛函數(shù) draw()。
  • Circle 和 Square 類實現(xiàn)了接口,重寫了 draw() 函數(shù)。
  • 可以通過接口類型的引用或指針來實現(xiàn)多態(tài)。

總結(jié)

  • 接口繼承的靈活性:通過使用抽象類(接口),我們可以定義統(tǒng)一的行為規(guī)范(draw())。不同的實現(xiàn)類(Circle 和 Square)可以各自實現(xiàn)該接口的函數(shù),從而提供特定的行為。這種設計模式使得代碼的可擴展性和可維護性得以提高。
  • 多態(tài)性:使用指向接口類的指針或引用可以實現(xiàn)多態(tài),允許我們在不修改 render 函數(shù)的情況下輕松添加新的形狀類。
  • 虛構(gòu)造和釋放:使用虛析構(gòu)函數(shù)確保在刪除基類指針時能夠正確地調(diào)用派生類的析構(gòu)函數(shù),從而避免內(nèi)存泄露。

實現(xiàn)繼承

實現(xiàn)繼承指的是繼承一個類的完整實現(xiàn),而不僅僅是接口。這意味著子類不僅可以使用父類的方法和屬性,還可以訪問和重用父類的實現(xiàn)。這種方式通常在需要共享代碼的場景中使用。

示例:

#include <iostream>  
// 基類  
class Shape {  
public:  
    void setPosition(int x, int y) {  
        m_x = x;  
        m_y = y;  
    }  
protected:  
    int m_x, m_y; // 保護的成員變量  
};  
class Circle : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a circle at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};  
class Square : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a square at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};  
int main() {  
    Circle circle;  
    circle.setPosition(10, 20);  
    circle.draw(); // 輸出: Drawing a circle at (10, 20).  
    Square square;  
    square.setPosition(30, 40);  
    square.draw(); // 輸出: Drawing a square at (30, 40).  
    return 0;  
}

輸出

Drawing a circle at (10, 20).  
Drawing a square at (30, 40).

代碼解析

基類定義

class Shape {  
public:  
    void setPosition(int x, int y) {  
        m_x = x;  
        m_y = y;  
    }  
protected:  
    int m_x, m_y; // 保護的成員變量  
};
  • 基類 Shape 是一個描述形狀的類。
  • setPosition(int x, int y) 方法 是一個公共方法,用于設置形狀的坐標。通過設置 m_x 和 m_y 成員變量,基類提供了一個基本的行為。
  • protected 修飾符 表示 m_x 和 m_y 只能在 Shape 類及其派生類中訪問。這賦予了派生類對這些成員的訪問權限,允許它們讀取和修改位置。
  • 派生類定義
class Circle : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a circle at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};
  • class Circle : public Shape 表示 Circle 類派生自 Shape 類,繼承了所有公共和保護成員。
  • void draw() 方法 在 Circle 類中實現(xiàn),負責輸出當前圓形的坐標信息。
class Square : public Shape {  
public:  
    void draw() {  
        std::cout << "Drawing a square at (" << m_x << ", " << m_y << ")." << std::endl;  
    }  
};
  • class Square : public Shape 類似于 Circle 類,Square 也繼承自 Shape 類。
  • draw() 方法負責輸出當前正方形的坐標信息。
  • 主函數(shù)實現(xiàn)
int main() {  
    Circle circle;  
    circle.setPosition(10, 20);  
    circle.draw(); // 輸出: Drawing a circle at (10, 20).  
    Square square;  
    square.setPosition(30, 40);  
    square.draw(); // 輸出: Drawing a square at (30, 40).  
    return 0;  
}
  • 在 main() 函數(shù)中,首先創(chuàng)建了一個 Circle 對象。
  • circle.setPosition(10, 20); 調(diào)用基類的 setPosition 方法設置圓形的坐標。
  • circle.draw(); 調(diào)用 Circle 類的 draw() 方法輸出圓形的坐標。
  • 類似的,對 Square 類進行相同的操作,設置其位置并輸出。

關鍵點

  • Shape 類提供了一些具體的實現(xiàn),比如 setPosition() 方法來設置形狀的位置。
  • Circle 和 Square 類繼承自 Shape,它們可以使用 Shape 中已實現(xiàn)的方法。
  • 子類可以重用父類的代碼,也可以擴展其功能。

總結(jié)

  • 實現(xiàn)繼承的作用:
    • Circle 和 Square 類繼承自 Shape 類,能夠重用基類的代碼,特別是 setPosition 方法,避免了重復實現(xiàn)。
    • 通過繼承,所有形狀類可以共享 Shape 類的成員和方法,簡化代碼結(jié)構(gòu)。
  • 訪問控制:
    • 使用 protected 修飾符允許派生類訪問基類的成員變量,保持數(shù)據(jù)的封裝性,但同時允許派生類訪問必要的數(shù)據(jù)。
  • 良好的可擴展性:
    • 由于 Shape 類作為基類,可以輕松添加更多形狀(例如 Triangle),只需繼承 Shape 類并實現(xiàn) draw() 方法而不需要重復代碼。
  • 多態(tài)性:
    • 在這個簡單的實現(xiàn)中沒有用到多態(tài)性,但可以通過把 draw() 方法聲明為虛函數(shù)和使用基類指針或引用來增強多態(tài)特性,這樣可以通過基類類型處理不同的派生類對象。

區(qū)別

到此這篇關于C++中如何實現(xiàn)接口繼承與實現(xiàn)繼承,以及它們的區(qū)別?的文章就介紹到這了,更多相關C++接口繼承與實現(xiàn)繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于C++實現(xiàn)柏林噪聲算法(Perlin?Noise)

    基于C++實現(xiàn)柏林噪聲算法(Perlin?Noise)

    Perlin噪聲(Perlin?noise,又稱為柏林噪聲)指由Ken?Perlin發(fā)明的自然噪聲生成算法,具有在函數(shù)上的連續(xù)性,并可在多次調(diào)用時給出一致的數(shù)值。本文將用C++實現(xiàn)柏林噪聲算法,感興趣的可以了解一下
    2023-03-03
  • C語言超詳細講解數(shù)據(jù)結(jié)構(gòu)中的線性表

    C語言超詳細講解數(shù)據(jù)結(jié)構(gòu)中的線性表

    線性表,數(shù)據(jù)結(jié)構(gòu)中最簡單的一種存儲結(jié)構(gòu),專門用于存儲邏輯關系為"一對一"的數(shù)據(jù)。線性表是基于數(shù)據(jù)在實際物理空間中的存儲狀態(tài),又可細分為順序表(順序存儲結(jié)構(gòu))和鏈表
    2022-05-05
  • C++?重載運算符在HotSpot?VM中的應用小結(jié)

    C++?重載運算符在HotSpot?VM中的應用小結(jié)

    C++支持運算符重載,對于Java開發(fā)者來說,這個可能比較陌生一些,因為Java不支持運算符重載,下面介紹一下HotSpot?VM中的運算符重載,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • C++實現(xiàn)合并兩個排序的鏈表

    C++實現(xiàn)合并兩個排序的鏈表

    這篇文章主要為大家詳細介紹了C++實現(xiàn)合并兩個排序的鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C語言 數(shù)據(jù)結(jié)構(gòu)中求解迷宮問題實現(xiàn)方法

    C語言 數(shù)據(jù)結(jié)構(gòu)中求解迷宮問題實現(xiàn)方法

    這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)中求解迷宮問題實現(xiàn)方法的相關資料,需要的朋友可以參考下
    2017-03-03
  • 一盤王者的時間用C語言實現(xiàn)三子棋

    一盤王者的時間用C語言實現(xiàn)三子棋

    相信我們都玩過三子棋,規(guī)則很簡單,但想用c語言做出這個游戲,事實上也是比較簡單的,下面通過c語言進行對五子棋的分析
    2022-02-02
  • c++使用Easyx圖形庫實現(xiàn)飛機大戰(zhàn)

    c++使用Easyx圖形庫實現(xiàn)飛機大戰(zhàn)

    本文詳細講解了c++使用Easyx圖形庫實現(xiàn)飛機大戰(zhàn),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C++ 中std::vector<T>的幾種清除方式

    C++ 中std::vector<T>的幾種清除方式

    std::vector<T>?可以通過多種方式清除(刪除所有元素),本文主要介紹了C++ 中std::vector<T>的幾種清除方式,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • C++ 項目引入lib和dll的區(qū)別與使用實戰(zhàn)

    C++ 項目引入lib和dll的區(qū)別與使用實戰(zhàn)

    靜態(tài)鏈接庫與動態(tài)鏈接庫都是共享代碼的方式,本文主要介紹了C++項目引入lib和dll的區(qū)別與使用實戰(zhàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • 基于MATLAB神經(jīng)網(wǎng)絡圖像識別的高識別率代碼

    基于MATLAB神經(jīng)網(wǎng)絡圖像識別的高識別率代碼

    今天小編就為大家分享一篇關于基于MATLAB神經(jīng)網(wǎng)絡圖像識別的高識別率代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

河南省| 沈丘县| 大名县| 西乌珠穆沁旗| 泗阳县| 新绛县| 浦东新区| 忻州市| 淅川县| 辉南县| 比如县| 图木舒克市| 磐安县| 东平县| 色达县| 林芝县| 新余市| 英德市| 凤城市| 东山县| 治县。| 瓮安县| 宁陕县| 上饶市| 吴旗县| 循化| 祁东县| 廊坊市| 建平县| 焉耆| 湘阴县| 万宁市| 友谊县| 凤庆县| 高清| 奉新县| 闻喜县| 天气| 尉犁县| 抚州市| 伊吾县|