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

C++關于指針,繼承和多態(tài)介紹

 更新時間:2022年01月07日 08:57:54   作者:山頂?shù)男〉朗? 
大家好,本篇文章主要講的是C++關于指針,繼承和多態(tài)介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

指針

我們在書本上學到的指針基本上都是:首先,指針是一個變量;其次,這個變量存儲的值是一個地址。這個是對指針的一個基本理解,最近在編程中發(fā)現(xiàn)了一些新的東西。

首先,指針不僅僅是一個地址,還存在一個和所指向內(nèi)容大小相關的值,如下代碼:

#include<iostream>

using namespace std;

int main()
{
    int a = 10;
    int *pa = &a;
    cout << "pa: " << pa << endl;
    cout << "pa+1: " << pa + 1 << endl;

    short b = 1;
    short *pb = &b;
    cout << "pb: " << pb << endl;
    cout << "pb+1: " << pb + 1 << endl;

    void *ppa = &a;
    cout << "ppa:" << ppa << endl;
    cout << "ppa+1: " << ppa + 1 << endl;

    return 0;
}

在這里插入圖片描述

從運行結果可以看出pa+1,地址增加了4個字節(jié);pb+1,地址增加了2個字節(jié);ppa+1,地址增加了2個字節(jié);而使用void指針指向整型變量a,此時ppa+1,地址只增加了1個自己。從這個結果我們可以很明顯看出,指針不僅僅是一個存地址的變量,還存在一個和內(nèi)存分配相關的值。其實進一步說,指針不僅僅是一個地址值,還存放著如何解釋內(nèi)存的規(guī)則。(void指針只存放地址,沒有解釋規(guī)則)

指針和繼承

眾所周知,繼承可以實現(xiàn)用父類的指針來指向子類的對象,為什么可以這樣用呢?正如上面所說,指針保存地址和解釋內(nèi)存的規(guī)則,當你聲明一個父類指針,那么你就指明了該指針的解釋規(guī)則,當你將子類地址傳給指針時,你就相當于給了一塊內(nèi)存給這個指針,然后這個指針就可以用它的規(guī)則去解釋這塊內(nèi)存。根據(jù)上面的說法,那么我們可以得出,子類對象中必定存在一塊內(nèi)存,其分配方式和父類對象一模一樣(如果把這塊內(nèi)存單獨提取出來,它就是一個父類對象),事實也是如此,而且這塊“父類對象”一般都是存放在子類對象的最前面,這就解釋了子類在構造的時候,一定會先調(diào)用父類構造函數(shù)。同時,“父類對象”指針只能訪問自己的父類成員。那么考慮多繼承的情況,多繼承的子類,其內(nèi)存空間中必定存在多個“父類對象”空間,這些父類空間的地址必定是不同的,那么就會造成同一個多繼承的子類,用其不同的父類指針指向它,其地址值是不同的,實際測試的確如此:

#include<iostream>
using namespace std;
class A
{
    public:
        int a = 10;
        long int aa = 100;
};

class B 
{
    public:
        int b = 20;

};

class C : public A, public B
{
    public:
        int c = 30;
};

int main()
{
    C c;
    A *pA;
    B *pB;
    C *pC;

    pA = &c;
    pB = &c;
    pC = &c;

    cout << "pA: " << pA << endl;
    cout << "pB: " << pB << endl;
    cout << "pC: " << pC << endl;
    cout << "pA.a: " << &(pA->a) << endl;
    cout << "pA.aa: " << &(pA->aa) << endl;
    cout << "pB.b: " << &(pB->b) << endl;
    cout << "pC.c: " << &(pC->c) << endl;

    return 0;
}

在這里插入圖片描述

在這里插入圖片描述

其內(nèi)存布局如圖,pA、pB都指向各自的“父類對象”空間起始位置,pA只能訪問a、aa,pB只能訪問b(至于為什么a是int卻占8個字節(jié),這個和內(nèi)存對齊有關,自行查詢)。

指針、繼承和多態(tài)

C++的繼承和多態(tài)繞不過的一個東西便是虛指針和虛函數(shù),這里簡單說一下:首先,在含有虛函數(shù)的類中,會產(chǎn)生一個虛函數(shù)表,注意這個虛函數(shù)表是從屬于類的,不是從屬于對象,也就是多個對象共享這個虛函數(shù)表。其次,每個類聲明的對象都會有一個虛指針,這個虛指針指向類的虛函數(shù)表。(這里只是簡單提及一下,更多的東西可以自行查詢)看過很多網(wǎng)上的東西,都說虛指針是每個對象的第一個數(shù)據(jù)成員,也就是分配在最開頭的地址空間。其實,我覺得這句話不完全正確,因為當多繼承中有虛函數(shù)時,虛函數(shù)表就有多個,虛指針也有多個,這些虛指針不一定全都存在于最開始的地址空間。應該說,這些虛指針存在于繼承的父類所管理區(qū)域的開頭:

#include<iostream>
using namespace std;
class A
{
    public:
        int a = 10;
        long int aa = 10;
        virtual void f()
        {

        }
};

class B 
{
    public:
        int b = 20;
        virtual void g()
        {

        }
};

class C : public A, public B
{
    public:
        int c = 30;
        virtual void cc()
        {

        }
};

int main()
{
    A *pA;
    B *pB;
    C c;
    pA = &c;
    pB = &c;
    cout << pA << endl;
    cout << &(pA->a) << endl;
    cout << &(pA->aa) << endl;
    cout << pB << endl;
    cout << &(pB->b) << endl;
    cout << &(c.c) << endl;

    return 0;
}

在這里插入圖片描述

在這里插入圖片描述

從上面的結果可以看出,虛指針不一定都是存在最開始的位置,如果硬要說是開始,應該也是相對于“父類對象”區(qū)域的開始。

到此這篇關于C++關于指針,繼承和多態(tài)介紹的文章就介紹到這了,更多相關C++指針 繼承 多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言互換最大值與最小值的位置

    C語言互換最大值與最小值的位置

    大家好,本篇文章主要講的是C語言互換最大值與最小值的位置,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 基于C語言編寫一個簡單的抽卡小游戲

    基于C語言編寫一個簡單的抽卡小游戲

    這篇文章主要為大家介紹了如何利用C語言實現(xiàn)原神抽卡的小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-04-04
  • 從零開始的Socket編程學習

    從零開始的Socket編程學習

    我們每天打開瀏覽器瀏覽網(wǎng)頁時,瀏覽器的進程怎么與web服務器通信的?QQ進程怎么與服務器或你好友所在的QQ進程通信?這些都得靠socket?那什么是socket?socket的類型有哪些?還有socket的基本函數(shù),下面小編帶大家了解下
    2019-05-05
  • C++設計模式中的工廠模式詳細介紹

    C++設計模式中的工廠模式詳細介紹

    工廠模式,是一種實例化對象的方式,只要輸入需要實例化對象的名字,就可以通過工廠對象的相應工廠函數(shù)來制造你需要的對象
    2022-09-09
  • 使用Qt實現(xiàn)文本文件的讀寫操作

    使用Qt實現(xiàn)文本文件的讀寫操作

    在現(xiàn)代應用程序開發(fā)中,文件操作是一個不可或缺的任務,無論是讀取配置文件、處理用戶輸入,還是保存日志信息,文件的讀取和寫入操作都非常重要,本文我們將展示如何通過一個簡單的圖形用戶界面(GUI),利用QFile、QTextStream和QFileDialog類來高效地進行文件操作
    2024-06-06
  • C++中簡單的文本文件輸入/輸出示例詳解

    C++中簡單的文本文件輸入/輸出示例詳解

    C++程序把輸入和輸出看作字節(jié)流,輸入時程序從輸入流中抽取字節(jié),輸出時程序將字節(jié)插入到輸出流中,下面這篇文章主要給大家介紹了關于C++中簡單的文本文件輸入/輸出的相關資料,需要的朋友可以參考下
    2021-12-12
  • c語言中的移位運算符

    c語言中的移位運算符

    這篇文章主要介紹了c語言中的移位運算符,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • Qt開發(fā)實現(xiàn)跨窗口信號槽通信

    Qt開發(fā)實現(xiàn)跨窗口信號槽通信

    這篇文章主要為大家詳細介紹了Qt開發(fā)實現(xiàn)跨窗口信號槽通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言實現(xiàn)從指定位置截取文件內(nèi)容

    C語言實現(xiàn)從指定位置截取文件內(nèi)容

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)從指定位置截取文件內(nèi)容,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • 概率的問題:使用遞歸與多次試驗模擬的分析

    概率的問題:使用遞歸與多次試驗模擬的分析

    以下對概率的問題:使用了遞歸和多次試驗模擬。需要的朋友參考下
    2013-05-05

最新評論

福清市| 南澳县| 靖州| 神池县| 江川县| 信丰县| 当阳市| 辽源市| 金寨县| 霍城县| 农安县| 万源市| 丘北县| 尚义县| 巴林左旗| 台山市| 沂南县| 广东省| 南投市| 磐石市| 五寨县| 曲松县| 宿松县| 文化| 收藏| 漠河县| 深水埗区| 延津县| 黄陵县| 屏东县| 施秉县| 聂荣县| 资兴市| 阳西县| 新源县| 安仁县| 滦南县| 永泰县| 石景山区| 怀仁县| 万安县|