C++對(duì)象切片在多態(tài)中表現(xiàn)如何

c++
小樊
83
2024-11-09 06:13:33

C++中的對(duì)象切片(Object Slicing)是指在多態(tài)過(guò)程中,派生類(lèi)對(duì)象被當(dāng)作基類(lèi)對(duì)象使用時(shí),派生類(lèi)的成員變量會(huì)被切掉,只剩下基類(lèi)的成員變量

對(duì)象切片在多態(tài)中的表現(xiàn)主要體現(xiàn)為丟失了派生類(lèi)的特性。當(dāng)一個(gè)派生類(lèi)對(duì)象被當(dāng)作基類(lèi)對(duì)象使用時(shí),它的動(dòng)態(tài)類(lèi)型變?yōu)榛?lèi),因此只能訪(fǎng)問(wèn)基類(lèi)的成員函數(shù)和成員變量。如果派生類(lèi)重寫(xiě)了基類(lèi)的虛函數(shù),那么這些重寫(xiě)的函數(shù)在基類(lèi)對(duì)象中將不會(huì)被調(diào)用,而是調(diào)用基類(lèi)的原始版本。這可能導(dǎo)致程序行為不符合預(yù)期,因?yàn)榛?lèi)版本的函數(shù)可能無(wú)法充分利用派生類(lèi)的特性。

為了避免對(duì)象切片,可以使用指針或引用來(lái)操作多態(tài)對(duì)象。這樣,即使對(duì)象被當(dāng)作基類(lèi)對(duì)象使用,實(shí)際上仍然可以通過(guò)指針或引用訪(fǎng)問(wèn)到派生類(lèi)的成員函數(shù)和成員變量。例如:

#include <iostream>

class Base {
public:
    virtual void print() const {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() const override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Derived d;
    Base* b = &d; // 使用指針避免對(duì)象切片
    b->print(); // 輸出 "Derived class"
    return 0;
}

在這個(gè)例子中,我們使用基類(lèi)指針b指向派生類(lèi)對(duì)象d,然后通過(guò)b調(diào)用print()函數(shù)。由于沒(méi)有發(fā)生對(duì)象切片,因此輸出了派生類(lèi)的版本。

0