91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++對象切片

發布時間:2020-07-12 08:56:04 來源:網絡 閱讀:1367 作者:fun8888888 欄目:編程語言

什么事對象切片:

  c++在將一個派生類轉換為基類的過程中,派生類的一部分將被基類接收不到,只能留下基類大小的對象。


傳值調用的切片:


#include<iostream>
using namespace std;
class Base
{
public:
virtual void func1()
{
cout << "Base::func1" << endl;
}
virtual void func2()
{
cout << "Base::func2" << endl;
}
private:
int a;
};
class Derive :public Base
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
}
virtual void func3()
{
cout << "Derive::func3" << endl;
}
virtual void func4()
{
cout << "Derive::func4" << endl;
}
private:
int b;
};
typedef void(*FUNC) ();
void PrintVTable(int* VTable)
{
cout << " 虛表地址>" << VTable << endl;
for (int i = 0; VTable[i] != 0; ++i)
{
printf(" 第%d個虛函數地址 :0X%x,->", i, VTable[i]);
FUNC f = (FUNC)VTable[i];
f();
}
cout << endl;
}
void function(Base b)
{
b.func1();
}
void Test1()
{
Base b1;
Derive d1;
int* VTable1 = (int*)(*(int*)&b1);
int* VTable2 = (int*)(*(int*)&d1);
PrintVTable(VTable1);
PrintVTable(VTable2);
function(d1);
}
int main()
{
Test1();
system("pause");
}

c++對象切片


c++對象切片

  再拷貝的過程中發生了切片,在調用構造函數的時候初始化VPTR指向基類的VTABLE,并且只拷貝了對象的基類部分,所以最后就變成了一個基類的對象。

  如果要防止這種現象的發生,只需把基類定義成純虛函數就可以了。




將派生類的指針傳遞給基類

#include<iostream>
using namespace std;
class Base
{
public:
virtual void func1()
{
cout << "Base::func1" << endl;
}
virtual void func2()
{
cout << "Base::func2" << endl;
}
private:
int a;
};
class Derive :public Base
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
}
virtual void func3()
{
cout << "Derive::func3" << endl;
}
virtual void func4()
{
cout << "Derive::func4" << endl;
}
private:
int b;
};
typedef void(*FUNC) ();
void PrintVTable(int* VTable)
{
cout << " 虛表地址>" << VTable << endl;
for (int i = 0; VTable[i] != 0; ++i)
{
printf(" 第%d個虛函數地址 :0X%x,->", i, VTable[i]);
FUNC f = (FUNC)VTable[i];
f();
}
cout << endl;
}
void function(Base* b)
{
b->func1();
b->func2();
}
void Test1()
{
Base b1;
Derive d1;
int* VTable1 = (int*)(*(int*)&b1);
int* VTable2 = (int*)(*(int*)&d1);
PrintVTable(VTable1);
PrintVTable(VTable2);
function((Base*)&d1);
}
int main()
{
Test1();
system("pause");
}


c++對象切片


c++對象切片

解釋:

   在將派生類的指針傳給基類之后,就將派生類的大小看作是積累的大小,所以就只能訪問基類的大小,由于沒有發生構造函數,所以VPTR還是派生類的。

向AI問一下細節
推薦閱讀:
  1. C++對象模型
  2. Golang 切片

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海门市| 化德县| 依兰县| 铜山县| 象州县| 奉节县| 渑池县| 常宁市| 云霄县| 乌兰察布市| 乐亭县| 琼结县| 广宁县| 湖口县| 察隅县| 土默特右旗| 香河县| 鹤山市| 乌鲁木齐县| 洪湖市| 宝鸡市| 佳木斯市| 镇康县| 天津市| 宁安市| 公安县| 巴南区| 八宿县| 砚山县| 从化市| 台前县| 徐汇区| 北辰区| 大关县| 咸丰县| 侯马市| 南江县| 三明市| 黄陵县| 德化县| 宜州市|