首页 >后端开发 >C++ >对象切片如何影响 C 中的多态性?

对象切片如何影响 C 中的多态性?

Susan Sarandon
Susan Sarandon原创
2024-12-17 11:20:27412浏览

How Does Object Slicing Affect Polymorphism in C  ?

多态中的对象切片:在基类变量中存储派生类对象

在 C 中使用继承时,可能会遇到以下问题对象切片。当派生类的对象被分配给基类变量时,会发生这种情况,导致派生类特定的成员丢失。

考虑以下示例:

class Base {
public:
    virtual void identify() {
        cout << "BASE" << endl;
    }
};

class Derived : public Base {
public:
    virtual void identify() {
        cout << "DERIVED" << endl;
    }
};

int main() {
    Derived derived;

    vector<Base> vect;
    vect.push_back(derived);

    vect[0].identify();
    return 0;
}

在此在代码中,我们期望identify()方法打印“DERIVED”,因为它是一个虚拟方法。但是,它会打印“BASE”。这是因为派生对象在存储在 vect 向量中时会被切片,而该向量被声明为保存 Base 对象。

要解决此问题并保持多态行为,必须在向量中存储指向基类的指针而不是对象本身:

vector<Base*> vect;
vect.push_back(&derived);

vect[0]->identify();

现在,vect[0] 指向 Derived 对象,确保派生类的identify()方法被调用并打印“DERIVED”。

为了进一步增强这种方法并避免手动内存管理,可以使用智能指针。例如:

vector<unique_ptr<Base>> vect;
vect.push_back(make_unique<Derived>());

vect[0]->identify();

这种方法可以确保自动管理 Derived 对象的内存,从而使代码更加高效且不易出错。

以上是对象切片如何影响 C 中的多态性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn