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

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

Susan Sarandon
发布: 2024-12-16 16:16:12
原创
793 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板