C++內(nèi)存對(duì)象布局小測(cè)試
對(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)文章
C++語(yǔ)法中的函數(shù)重載和默認(rèn)參數(shù)
這篇文章主要介紹了C++語(yǔ)法中的函數(shù)重載和默認(rèn)參數(shù),本文從語(yǔ)法角度通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03C語(yǔ)言編程之三個(gè)方法實(shí)現(xiàn)strlen函數(shù)
本篇文章是C語(yǔ)言編程篇,主要為大家介紹C語(yǔ)言編程中實(shí)現(xiàn)strlen函數(shù)的三個(gè)方法講解,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09C語(yǔ)言編寫簡(jiǎn)單的定時(shí)關(guān)機(jī)程序
本文給大家分享的是一則C語(yǔ)言編寫的簡(jiǎn)單的定時(shí)關(guān)機(jī)程序,可以設(shè)置0-600秒倒計(jì)時(shí),有需要的小伙伴可以參考下。2016-02-02深入分析為Visual Assist設(shè)置快捷鍵的方法
本篇文章是對(duì)為Visual Assist設(shè)置快捷鍵的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05圖解AVL樹數(shù)據(jù)結(jié)構(gòu)輸入與輸出及實(shí)現(xiàn)示例
這篇文章主要為大家介紹了C++圖解AVL樹數(shù)據(jù)結(jié)構(gòu)輸入與輸出操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問(wèn)題
這篇文章主要給大家介紹了關(guān)于如何利用C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問(wèn)題,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-12-12VisualStudio2022配置opencv的實(shí)現(xiàn)
本文主要介紹了VisualStudio2022配置opencv的實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06C++深入分析講解函數(shù)與重載知識(shí)點(diǎn)
C++?允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function?Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途2022-06-06