欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++中虛函數(shù)詳解及其作用介紹

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

概述

虛函數(shù) (virtual function) 指可以被子類繼承和覆蓋的函數(shù).

在這里插入圖片描述

使用方法

基類聲明成員函數(shù)為虛函數(shù)的方法:

virtual [類型] 函數(shù)名([參數(shù)表列])

注: 在類外定義虛函數(shù)時, 不需再加 virtual.

虛函數(shù)的特點:

  • 提高程序擴充性: 派生類根據(jù)需要可以進行函數(shù)覆蓋
  • 成員函數(shù)被聲明為虛數(shù)后, 其派生類中覆蓋函數(shù)自動稱為虛函數(shù)
  • 若虛函數(shù)在派生類中未重新定義, 則派生類簡單繼承其直接基類的虛函數(shù)
  • 指向基類的指針, 當指向派生類對象時, 可以嗲用派生類的方法

關聯(lián)

通過關聯(lián) (binding), 我們可以把一個標識符和一個存儲地址聯(lián)系起來, 或者把一個函數(shù)名與一個類對象捆綁在一起.

在這里插入圖片描述

靜態(tài)關聯(lián)

靜態(tài)關聯(lián) (static binding) 指通過對象名調(diào)用虛函數(shù). 在編譯時即可確定其調(diào)用的虛函數(shù)屬于哪一類

動態(tài)關聯(lián)

動態(tài)關聯(lián) (dynamic binding) 是指通過基類指針與虛函數(shù), 在運行階段確定關聯(lián)關系. 動態(tài)關聯(lián)提供動態(tài)的多態(tài)性, 即運行階段的多態(tài)性.

案例1

未使用虛函數(shù)

Square 類:

#ifndef PROJECT6_SQUARE_H
#define PROJECT6_SQUARE_H

class Square {
protected:
    int length;
public:
    Square(int l) : length(l) {};
    int area() const {
        return length *length;
    }
};

#endif //PROJECT6_SQUARE_H

Rectangle 類:

#ifndef PROJECT6_RECTANGLE_H
#define PROJECT6_RECTANGLE_H

#include "Square.h"

class Rectangle : public Square{
private:
    int height;
public:
    Rectangle(int l, int h) : Square(l), height(h) {};
    int area() const {
        return Square::area() * 2 + length * height * 4;  // 兩個底加四個邊
    }
};

#endif //PROJECT6_RECTANGLE_H

main:

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

int main() {
    // 創(chuàng)建對象
    Square s1(2), *pt;
    Rectangle r1(3, 3);

    pt = &s1;
    cout << pt->area() << endl;
    pt = &r1;
    cout << pt->area() << endl;

    return 0;
}

輸出結(jié)果:

4
9 // 輸出的是底面積

此時調(diào)用的是 Square 類的area()函數(shù).

使用虛擬類

Square 類:

#ifndef PROJECT6_SQUARE_H
#define PROJECT6_SQUARE_H

class Square {
protected:
    int length;
public:
    Square(int l) : length(l) {};
    virtual int area() const {
        return length *length;
    }
};

#endif //PROJECT6_SQUARE_H

Rectangle 類:

#ifndef PROJECT6_RECTANGLE_H
#define PROJECT6_RECTANGLE_H

#include "Square.h"

class Rectangle : public Square{
private:
    int height;
public:
    Rectangle(int l, int h) : Square(l), height(h) {};
    int area() const {
        return Square::area() * 2 + length * height * 4;  // 兩個底加四個邊
    }
};

#endif //PROJECT6_RECTANGLE_H

main:

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

int main() {
    // 創(chuàng)建對象
    Square s1(2), *pt;
    Rectangle r1(3, 3);

    pt = &s1;
    cout << pt->area() << endl;
    pt = &r1;
    cout << pt->area() << endl;

    return 0;
}

輸出結(jié)果:

4
54 // 長方體的面積

此時調(diào)用的是 Rectangle 類的area()函數(shù).

案例2

Animal 類:

#ifndef PROJECT6_ANIMAL_H
#define PROJECT6_ANIMAL_H

#include <iostream>
using namespace std;

class Animal {
public:
    virtual void bark(){
        cout << "咋叫?" << endl;
    }
};

#endif //PROJECT6_ANIMAL_H

Dog 類:

#ifndef PROJECT6_DOG_H
#define PROJECT6_DOG_H

#include "Animal.h"

class Dog : public Animal{
public:
    void bark() {
        cout << "汪汪!" << endl;
    }
};

#endif //PROJECT6_DOG_H

Cat 類:

#ifndef PROJECT6_CAT_H
#define PROJECT6_CAT_H

#include "Animal.h"

class Cat : public Animal{
public:
    void bark() {
        cout << "喵喵!" << endl;
    }
};

#endif //PROJECT6_CAT_H

Pig 類:

#ifndef PROJECT6_PIG_H
#define PROJECT6_PIG_H

#include "Animal.h"

class Pig : public Animal {
public:
    void bark() {
        cout << "哼哼!" << endl;
    }
};

#endif //PROJECT6_PIG_H

main:

#include <iostream>
#include "Animal.h"
#include "Dog.h"
#include "Cat.h"
#include "Pig.h"
using namespace std;

int main() {
    // 創(chuàng)建對象
    Animal a, *pt;
    Dog d;
    Cat c;
    Pig p;

    pt = &a;
    pt -> bark();  // 調(diào)用基類的bark()
    pt = &d;
    pt -> bark();  // 調(diào)用狗的bark()
    pt = &c;
    pt -> bark();  // 調(diào)用貓的bark()
    pt = &p;
    pt -> bark();  // 調(diào)用豬的bark()

    return 0;
}

輸出結(jié)果:

咋叫?
汪汪!
喵喵!
哼哼!

總結(jié)

虛函數(shù)只能是類的成員函數(shù), 而不能將類外的普通函數(shù)聲明為虛函數(shù). 虛函數(shù)的作用是允許在派生類中對基類的虛函數(shù)重新定義 (函數(shù)覆蓋), 只能用于類的繼承層次結(jié)構(gòu)中.

虛函數(shù)能有效減少空間開銷. 當一個類帶有虛函數(shù)時, 編譯系統(tǒng)會為該類構(gòu)造一個虛函數(shù)表 (一個指針數(shù)組), 用于存放每個虛函數(shù)的入口地址.

什么時候應該使用虛函數(shù):

  • 判斷成員函數(shù)所在的類是不是基類, 非基類無需使用虛函數(shù)
  • 成員函數(shù)在類被繼承后有沒有可能被更改的功能, 如果希望修改成員函數(shù)功能, 一般在基類中將其聲明為虛函數(shù)
  • 我們會通過對象名還是基類指針訪問成員函數(shù), 如果通過基類指針過引用去訪問, 則應當聲明為虛函數(shù)

有時候在定義虛函數(shù)的時候, 我們無需定義其函數(shù)體. 它的作用只是定義了一個虛函數(shù)名, 具體的功能留給派生類去添加, 也就是純虛函數(shù). 例如我們在上面的 Animal 類的bark()函數(shù)就應該聲明為純虛函數(shù), 因為 Animal 為基類, 定義bark()函數(shù)實體并無意義.

相關文章

  • C語言中棧的兩種實現(xiàn)方法詳解

    C語言中棧的兩種實現(xiàn)方法詳解

    棧只允許在一端進行插入或刪除操作的線性表。首先棧是一種線性表,但是限定這種線性表只能在某一端進行插入和刪除操作,這篇文章主要介紹了C語言對棧的實現(xiàn)基本操作
    2021-08-08
  • C語言詳解判斷相同樹案例分析

    C語言詳解判斷相同樹案例分析

    這篇文章主要介紹了用C語言檢查兩棵樹是否相同,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2022-04-04
  • 使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作

    使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作

    這篇文章給大家介紹了使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作,文中通過圖文結(jié)合的方式介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • 使用C++程序獲取新浪行情數(shù)據(jù)的方法

    使用C++程序獲取新浪行情數(shù)據(jù)的方法

    這篇文章介紹了在一定的周期范圍內(nèi)去抓取新浪中行情數(shù)據(jù),通過更新數(shù)據(jù)來緩解構(gòu)造模擬數(shù)據(jù)與真實數(shù)據(jù)差異性,感興趣的朋友可以了解一下
    2015-07-07
  • C語言中的字符型數(shù)據(jù)與ASCII碼表

    C語言中的字符型數(shù)據(jù)與ASCII碼表

    這篇文章主要介紹了C語言中的字符型數(shù)據(jù)與ASCII碼表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C語言 結(jié)構(gòu)體數(shù)組詳解及示例代碼

    C語言 結(jié)構(gòu)體數(shù)組詳解及示例代碼

    本文主要介紹C語言 結(jié)構(gòu)體數(shù)組,這里整理了相關資料及簡單示例代碼,以便大家學習參考,有興趣的小伙伴可以看下
    2016-08-08
  • C語言 完整游戲項目推箱子詳細代碼

    C語言 完整游戲項目推箱子詳細代碼

    經(jīng)典的推箱子是一個的古老游戲,目的是在訓練你的邏輯思考能力。在一個狹小的倉庫中,要求把木箱放到指定的位置,稍不小心就會出現(xiàn)箱子無法移動或者通道被堵住的情況,所以需要巧妙的利用有限的空間和通道,合理安排移動的次序和位置,才能順利的完成任務
    2021-11-11
  • C語言入門篇--初識指針和指針變量

    C語言入門篇--初識指針和指針變量

    本篇文章是基礎篇,適合c語言剛?cè)腴T的朋友,本文對初識c語言的指針和指針變量做了簡單的分析,幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C語言實現(xiàn)通訊錄小功能

    C語言實現(xiàn)通訊錄小功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄小功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++面向?qū)ο笳Z言自制多級菜單功能實現(xiàn)代碼

    C++面向?qū)ο笳Z言自制多級菜單功能實現(xiàn)代碼

    菜單類主要負責菜單的創(chuàng)建、修改、刪除,是包含菜單結(jié)構(gòu)組織和響應函數(shù)的模型,用戶擁有充分的自主性,可根據(jù)需要自定義菜單顯示和響應函數(shù),這篇文章主要介紹了C++面向?qū)ο笳Z言自制多級菜單,需要的朋友可以參考下
    2024-06-06

最新評論