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

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

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

概述

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

在這里插入圖片描述

使用方法

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

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

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

虛函數(shù)的特點(diǎn):

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

關(guān)聯(lián)

通過(guò)關(guān)聯(lián) (binding), 我們可以把一個(gè)標(biāo)識(shí)符和一個(gè)存儲(chǔ)地址聯(lián)系起來(lái), 或者把一個(gè)函數(shù)名與一個(gè)類(lèi)對(duì)象捆綁在一起.

在這里插入圖片描述

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

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

動(dòng)態(tài)關(guān)聯(lián)

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

案例1

未使用虛函數(shù)

Square 類(lèi):

#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 類(lèi):

#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;  // 兩個(gè)底加四個(gè)邊
    }
};

#endif //PROJECT6_RECTANGLE_H

main:

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

int main() {
    // 創(chuàng)建對(duì)象
    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 // 輸出的是底面積

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

使用虛擬類(lèi)

Square 類(lèi):

#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 類(lèi):

#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;  // 兩個(gè)底加四個(gè)邊
    }
};

#endif //PROJECT6_RECTANGLE_H

main:

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

int main() {
    // 創(chuàng)建對(duì)象
    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 // 長(zhǎng)方體的面積

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

案例2

Animal 類(lèi):

#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 類(lèi):

#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 類(lèi):

#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 類(lèi):

#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)建對(duì)象
    Animal a, *pt;
    Dog d;
    Cat c;
    Pig p;

    pt = &a;
    pt -> bark();  // 調(diào)用基類(lèi)的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ù)只能是類(lèi)的成員函數(shù), 而不能將類(lèi)外的普通函數(shù)聲明為虛函數(shù). 虛函數(shù)的作用是允許在派生類(lèi)中對(duì)基類(lèi)的虛函數(shù)重新定義 (函數(shù)覆蓋), 只能用于類(lèi)的繼承層次結(jié)構(gòu)中.

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

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

  • 判斷成員函數(shù)所在的類(lèi)是不是基類(lèi), 非基類(lèi)無(wú)需使用虛函數(shù)
  • 成員函數(shù)在類(lèi)被繼承后有沒(méi)有可能被更改的功能, 如果希望修改成員函數(shù)功能, 一般在基類(lèi)中將其聲明為虛函數(shù)
  • 我們會(huì)通過(guò)對(duì)象名還是基類(lèi)指針訪問(wèn)成員函數(shù), 如果通過(guò)基類(lèi)指針過(guò)引用去訪問(wèn), 則應(yīng)當(dāng)聲明為虛函數(shù)

有時(shí)候在定義虛函數(shù)的時(shí)候, 我們無(wú)需定義其函數(shù)體. 它的作用只是定義了一個(gè)虛函數(shù)名, 具體的功能留給派生類(lèi)去添加, 也就是純虛函數(shù). 例如我們?cè)谏厦娴?Animal 類(lèi)的bark()函數(shù)就應(yīng)該聲明為純虛函數(shù), 因?yàn)?Animal 為基類(lèi), 定義bark()函數(shù)實(shí)體并無(wú)意義.

相關(guān)文章

  • C語(yǔ)言實(shí)例梳理講解常用關(guān)鍵字的用法

    C語(yǔ)言實(shí)例梳理講解常用關(guān)鍵字的用法

    關(guān)鍵字是C語(yǔ)言非常重要的一部分,熟練的掌握和使用關(guān)鍵字有助于我們更加熟悉了解C語(yǔ)言,同時(shí)C語(yǔ)言的關(guān)鍵字也是面試筆試中??嫉膬?nèi)容。C語(yǔ)言的關(guān)鍵字共有32個(gè),但并不是每個(gè)關(guān)鍵字都有坑,本篇文章將通過(guò)理論聯(lián)系實(shí)際的方式為大家講解C語(yǔ)言中易混易錯(cuò)以及??嫉囊恍╆P(guān)鍵字
    2022-05-05
  • C++實(shí)踐排序函數(shù)模板項(xiàng)目的參考方法

    C++實(shí)踐排序函數(shù)模板項(xiàng)目的參考方法

    今天小編就為大家分享一篇關(guān)于C++實(shí)踐排序函數(shù)模板項(xiàng)目的參考方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • c++初級(jí)并查集知識(shí)點(diǎn)總結(jié)

    c++初級(jí)并查集知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給各位分享的是關(guān)于c++初級(jí)并查集知識(shí)點(diǎn)以及實(shí)例代碼內(nèi)容,有需要的朋友們學(xué)習(xí)下。
    2019-07-07
  • C++中l(wèi)ist容器的實(shí)現(xiàn)

    C++中l(wèi)ist容器的實(shí)現(xiàn)

    本文主要介紹了C++中l(wèi)ist容器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • c++ 端口掃描程序?qū)崿F(xiàn)案例

    c++ 端口掃描程序?qū)崿F(xiàn)案例

    下面小編就為大家?guī)?lái)一篇c++ 端口掃描程序?qū)崿F(xiàn)案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • C語(yǔ)言Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)

    C語(yǔ)言Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)

    iniparser是針對(duì)INI文件的解析器。ini文件則是一些系統(tǒng)或者軟件的配置文件。本文就來(lái)介紹一下如何利用Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)吧
    2023-03-03
  • C++實(shí)現(xiàn)LeetCode(209.最短子數(shù)組之和)

    C++實(shí)現(xiàn)LeetCode(209.最短子數(shù)組之和)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(209.最短子數(shù)組之和),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++如何保存bmp圖片

    C++如何保存bmp圖片

    這篇文章主要介紹了C++如何保存bmp圖片問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問(wèn)題

    C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問(wèn)題

    這篇文章主要介紹了C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • c病毒程序原理分析(防范病毒 c語(yǔ)言小病毒示例)

    c病毒程序原理分析(防范病毒 c語(yǔ)言小病毒示例)

    這篇文章主要介紹了病毒程序原理,寫(xiě)個(gè)小程序做演示,大家可以參考這個(gè)以防中相似C病毒
    2013-12-12

最新評(píng)論

红桥区| 车险| 登封市| 漠河县| 本溪市| 永寿县| 宿迁市| 昌吉市| 山阳县| 灵石县| 鹰潭市| 合山市| 凌云县| 梅州市| 乾安县| 钦州市| 潮州市| 盐池县| 龙江县| 崇阳县| 库伦旗| 呼图壁县| 滕州市| 连山| 丰城市| 鄄城县| 梧州市| 图们市| 河北省| 清水河县| 定州市| 南安市| 康保县| 陆河县| 滨海县| 洱源县| 贵定县| 保定市| 淮阳县| 汝州市| 汉沽区|