對象分割概念:
當(dāng)一個子類對象通過值傳遞給基類對象吟逝,如print(A a),這個基類的拷貝構(gòu)造函數(shù)將被調(diào)用.此時子類的特性將被切割,只有基類相關(guān)操作啤月。也就是說如果我們向上轉(zhuǎn)型如果不用引用或指針,對象將被切割肌索。這是也我們應(yīng)該傳引用而不是傳值的原因绷落。
在傳值例子中饭聚,因為print()是被A 的對象執(zhí)行的object.這樣倒至A對象被進行壓棧操作.這樣就造成如果是值傳遞調(diào)用A默認(rèn)構(gòu)造函數(shù),初始化vptr通過A類的vtbl并且只拷貝A部分.所以結(jié)果只剩下A部分了逸雹。
#include <iostream>
#include <cstdlib>
using namespace std;
class Base
{
public:
virtual void fun()
{
cout << "Base fun() is Called" << endl;
}
};
class Derived:public Base
{
public:
void fun()
{
cout << "Derived fun() is Called" << endl;
}
};
void fun1(Base b)
{
b.fun();
}
void fun2(Base *b)
{
b->fun();
}
void fun3(Base &b)
{
b.fun();
}
int main()
{
Derived d;
fun1(d);
fun2(&d);
fun3(d);
system("pause");
return 0;
}
輸出的結(jié)果:
Base fun() is Called Derived fun() is Called Derived fun() is Called
多態(tài)的實現(xiàn)是通過指針和引用;而對象的轉(zhuǎn)換只會造成對象切割俐镐,不能實現(xiàn)多態(tài) 矫限。
https://blog.csdn.net/beckle_ye/article/details/4700612?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1