首页 >后端开发 >C++ >使用 C 向量继承时如何避免对象切片?

使用 C 向量继承时如何避免对象切片?

Susan Sarandon
Susan Sarandon原创
2024-12-16 16:16:12804浏览

How Can I Avoid Object Slicing When Using Inheritance with C   Vectors?

向量容器中的对象切片和多态性

在 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;
}

代码创建 Base 对象的向量并存储 Derived 类的实例。但是,当对存储的对象调用identify() 方法时,它会打印“BASE”而不是“DERIVED”。这是因为将 Derived 对象分配给 Base 向量元素时会发生对象切片,导致派生特定数据丢失。

为了防止对象切片并保留多态行为,首选解决方案是使用指针向量中的基类对象:

vector<Base*>

这确保派生类特定数据保持完整。此外,为了避免手动内存管理,可以使用智能指针:

vector<std::shared_ptr<Base>>

智能指针通过 RAII(资源获取即初始化)确保自动内存管理,使其成为更强大且符合 C 的方法。

以上是使用 C 向量继承时如何避免对象切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

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