对象切片和多态行为
在面向对象编程中,将派生类对象存储在基类变量中可能会导致意外行为,称为对象切片。当基类变量被分配派生类的对象时,会出现此问题,导致派生类特定的成员因对象切片而丢失。
示例:
考虑以下程序:
#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中文网其他相关文章!