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ì)象的大?。ㄖ羔槺旧碇徽?個(gè)字節(jié)),當(dāng)把子類指針賦值給父類指針時(shí)(如main函數(shù)里第一句語句),不會(huì)報(bào)錯(cuò),并且由于虛函數(shù)表的存在,父類指針成功間接訪問到了子類定義的虛函數(shù)。
而將子類對(duì)象賦值給父類對(duì)象時(shí)(如main函數(shù)里第二句語句),實(shí)際上是調(diào)用了一個(gè)拷貝構(gòu)造函數(shù),并將子類轉(zhuǎn)型為父類對(duì)象傳進(jìn)拷貝構(gòu)造函數(shù))自然無法產(chǎn)生多態(tài)。
再看3)的輸出,其實(shí)和2)同理,調(diào)用拷貝構(gòu)造函數(shù)
4)的輸出自然也沒有問題,取得同一個(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)文章!
- C++動(dòng)態(tài)內(nèi)存分配的核心機(jī)制與最佳實(shí)踐(從對(duì)象生命周期到智能管理)
- C++利用對(duì)象池優(yōu)化內(nèi)存管理解決MISRA報(bào)警的代碼詳解
- c++對(duì)象內(nèi)存布局示例詳解
- C++ 面向?qū)ο蟪绦蛟O(shè)計(jì)--內(nèi)存分區(qū)詳解
- 關(guān)于C++對(duì)象繼承中的內(nèi)存布局示例詳解
- 由static_cast和dynamic_cast到C++對(duì)象占用內(nèi)存的全面分析
- 淺談C++對(duì)象的內(nèi)存分布和虛函數(shù)表
- C++對(duì)象內(nèi)存分布詳解(包括字節(jié)對(duì)齊和虛函數(shù)表)
- 淺談C++中派生類對(duì)象的內(nèi)存布局
- C++對(duì)象的內(nèi)存結(jié)構(gòu)的實(shí)現(xiàn)
相關(guān)文章
一篇文章帶你了解C++多態(tài)的實(shí)現(xiàn)原理
這篇文章主要介紹了C++多態(tài)的實(shí)現(xiàn)機(jī)制理解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來幫助2021-08-08
c++中虛函數(shù)和純虛函數(shù)的作用與區(qū)別
這篇文章主要介紹了c++中虛函數(shù)和純虛函數(shù)的作用與區(qū)別,需要的朋友可以參考下2014-07-07
C++實(shí)現(xiàn)LeetCode(115.不同的子序列)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(115.不同的子序列),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++項(xiàng)目開發(fā)實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++項(xiàng)目開發(fā)實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱2022-12-12
C++中Boost庫安裝使用指南(VS2022?+?vcpkg)
本文主要介紹了C++中Boost庫安裝使用指南(VS2022?+?vcpkg),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-06-06

