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

C++內(nèi)存對(duì)象布局小測(cè)試

 更新時(shí)間:2023年12月08日 08:36:46   作者:柏下微雨  
這篇文章主要介紹了C++內(nèi)存對(duì)象布局小測(cè)試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

對(duì)象布局

如圖:

布局測(cè)試

如果不了解的讀者可以自行學(xué)習(xí),在此我對(duì)對(duì)象布局做一些測(cè)試,代碼如下:

class Point2D {
public:
    Point2D(int x, int y) :x(x), y(y) {}
    Point2D(const Point2D& p) {
        cout << "copy2d" << endl;
        x = p.x, y = p.y;
    }
    virtual void print() const{
        cout << x << " " << y << endl;
    }
    virtual ~Point2D() {}
protected:
    int x;
    int y;
};
class Point3D : public Point2D {
public:
    Point3D(int x, int y, int z) :Point2D(x, y), z(z) {}
    virtual void print()const {
        cout << x << " " << y << " " << z << endl;
    }
private:
    int z;
};
int main() {
    Point2D* p2d = new Point3D(1, 2, 3);
    Point2D p2d2 = Point3D(1,2,3);//輸出copy2d
    p2d->print();//1)輸出為1,2,3
    p2d2.print();//2)輸出為1,2
    Point2D p2d1 = *p2d;//輸出copy2d
    p2d1.print();//3)輸出為1,2
    (*p2d).print();//4)輸出為1,2,3
    Point3D* p3d = p2d;//Point2D*類型的值不能用于初始化Point3D*類型的實(shí)體
}

分析

首先我們需要知道,為什么只有指針和引用可以實(shí)現(xiàn)多態(tài),而普通的對(duì)象聲明不可以。因?yàn)橹羔樅鸵貌⒉恢付ㄋ笇?duì)象的大小(指針本身只占8個(gè)字節(jié)),當(dāng)把子類指針賦值給父類指針時(shí)(如main函數(shù)里第一句語(yǔ)句),不會(huì)報(bào)錯(cuò),并且由于虛函數(shù)表的存在,父類指針成功間接訪問(wèn)到了子類定義的虛函數(shù)。

而將子類對(duì)象賦值給父類對(duì)象時(shí)(如main函數(shù)里第二句語(yǔ)句),實(shí)際上是調(diào)用了一個(gè)拷貝構(gòu)造函數(shù),并將子類轉(zhuǎn)型為父類對(duì)象傳進(jìn)拷貝構(gòu)造函數(shù))自然無(wú)法產(chǎn)生多態(tài)。

再看3)的輸出,其實(shí)和2)同理,調(diào)用拷貝構(gòu)造函數(shù)

4)的輸出自然也沒(méi)有問(wèn)題,取得同一個(gè)地址空間的虛函數(shù)。

參考:https://www.bilibili.com/video/BV1v64y1q7JT/?p=1&spm_id_from=...,《深度探索C++對(duì)象模型》

以上就是C++內(nèi)存對(duì)象布局小測(cè)試的詳細(xì)內(nèi)容,更多關(guān)于C++內(nèi)存對(duì)象布局的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論