首页 > 后端开发 > C++ > C 语言中如何避免对象切片来实现多态行为?

C 语言中如何避免对象切片来实现多态行为?

DDD
发布: 2024-12-26 04:33:10
原创
428 人浏览过

How Can Object Slicing Be Avoided in C   to Achieve Polymorphic Behavior?

对象切片和多态行为

在面向对象编程中,将派生类对象存储在基类变量中可能会导致意外行为,称为对象切片。当基类变量被分配派生类的对象时,会出现此问题,导致派生类特定的成员因对象切片而丢失。

示例:

考虑以下程序:

#include <iostream>
#include <vector>
using namespace std;

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;
}
登录后复制

在这个例子中,派生类对象导出存储在基类的向量中对象矢量。然而,当调用基类对象 vect[0] 上的 recognize() 方法时,它输出“BASE”而不是预期的“DERIVED”。

解决方案:

为了防止对象切片并实现多态行为,正确的做法是在矢量:

vector<Base*> vect;
登录后复制

通过使用指针,保留派生类特定的成员,从而允许所需的多态行为。

使用智能指针的增强解决方案:

为了确保正确的内存管理,建议使用合适的智能指针而不是原始指针指针:

vector<unique_ptr<Base>> vect;
登录后复制

这确保了使用资源获取即初始化(RAII)自动管理基类对象的内存,使代码更加高效和健壮。

以上是C 语言中如何避免对象切片来实现多态行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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